chore: Init repo, add docs
37
.cargo/audit.toml
Normal file
@ -0,0 +1,37 @@
|
||||
# Generated by dev-system/ci
|
||||
# cargo-audit configuration for security vulnerability scanning
|
||||
|
||||
# Database configuration
|
||||
[advisories]
|
||||
# The database path
|
||||
db-path = "~/.cargo/advisory-db"
|
||||
|
||||
# Advisory database URLs
|
||||
db-urls = ["https://github.com/rustsec/advisory-db"]
|
||||
|
||||
# How to handle different kinds of advisories
|
||||
# "allow" - Pass the check despite the warning
|
||||
# "warn" - Pass the check but warn about the issue
|
||||
# "deny" - Fail the check
|
||||
deny = ["unmaintained", "unsound", "yanked"]
|
||||
|
||||
# Specific vulnerability IDs to ignore (in case of false positives)
|
||||
# You can use: https://rustsec.org/
|
||||
ignore = [
|
||||
# Example: { id = "RUSTSEC-2023-XXXX", reason = "Not applicable to our use case" }
|
||||
]
|
||||
|
||||
# How to handle vulnerabilities based on severity
|
||||
[output]
|
||||
# Deny on high severity vulnerabilities
|
||||
deny = ["high", "critical"]
|
||||
# Warn on medium severity vulnerabilities
|
||||
warn = ["medium", "low"]
|
||||
# Advisory format: "terminal", "json"
|
||||
format = "terminal"
|
||||
|
||||
# Target configuration
|
||||
[target]
|
||||
# Check only specific targets
|
||||
# Uncomment to restrict to specific target triples
|
||||
# triple = "x86_64-unknown-linux-gnu"
|
||||
77
.cargo/config.toml
Normal file
@ -0,0 +1,77 @@
|
||||
# Generated by dev-system/ci
|
||||
# Cargo configuration for build and compilation settings
|
||||
|
||||
[build]
|
||||
# Number of parallel jobs for compilation
|
||||
jobs = 4
|
||||
|
||||
# Code generation backend
|
||||
# codegen-backend = "llvm"
|
||||
|
||||
[profile.dev]
|
||||
# Development profile - fast compilation, debug info
|
||||
opt-level = 0
|
||||
debug = true
|
||||
debug-assertions = true
|
||||
overflow-checks = true
|
||||
lto = false
|
||||
panic = "unwind"
|
||||
incremental = true
|
||||
|
||||
[profile.release]
|
||||
# Release profile - slow compilation, optimized binary
|
||||
opt-level = 3
|
||||
debug = false
|
||||
debug-assertions = false
|
||||
overflow-checks = false
|
||||
lto = "thin"
|
||||
codegen-units = 1
|
||||
panic = "abort"
|
||||
incremental = false
|
||||
strip = false
|
||||
|
||||
[profile.test]
|
||||
# Test profile - inherits from dev but can be optimized
|
||||
opt-level = 1
|
||||
debug = true
|
||||
debug-assertions = true
|
||||
overflow-checks = true
|
||||
lto = false
|
||||
panic = "unwind"
|
||||
incremental = true
|
||||
|
||||
[profile.bench]
|
||||
# Benchmark profile - same as release
|
||||
opt-level = 3
|
||||
debug = false
|
||||
debug-assertions = false
|
||||
overflow-checks = false
|
||||
lto = "thin"
|
||||
codegen-units = 1
|
||||
panic = "abort"
|
||||
incremental = false
|
||||
|
||||
# Resolver version
|
||||
resolver = "2"
|
||||
|
||||
[term]
|
||||
# Terminal colors
|
||||
color = "auto"
|
||||
verbose = false
|
||||
progress.when = "auto"
|
||||
progress.width = 80
|
||||
|
||||
[net]
|
||||
# Network settings
|
||||
git-fetch-with-cli = true
|
||||
offline = false
|
||||
|
||||
# Strict version requirements for dependencies
|
||||
# force-non-semver-pre = true
|
||||
|
||||
[alias]
|
||||
# Custom cargo commands
|
||||
build-all = "build --all-targets"
|
||||
check-all = "check --all-targets --all-features"
|
||||
test-all = "test --all-features --workspace"
|
||||
doc-all = "doc --all-features --no-deps --open"
|
||||
17
.clippy.toml
Normal file
@ -0,0 +1,17 @@
|
||||
# Generated by dev-system/ci
|
||||
# Clippy configuration for Rust linting
|
||||
|
||||
# Lint level thresholds
|
||||
cognitive-complexity-threshold = 25
|
||||
type-complexity-threshold = 500
|
||||
excessive-nesting-threshold = 5
|
||||
|
||||
# Allowed patterns (prevent lints on specific code)
|
||||
# allow-expect-in-tests = true
|
||||
# allow-unwrap-in-tests = true
|
||||
|
||||
# Single-character variable name threshold
|
||||
single-char-binding-names-threshold = 4
|
||||
|
||||
# Note: Lint configurations belong in Cargo.toml under [lints.clippy] or [workspace.lints.clippy]
|
||||
# This file only contains clippy configuration parameters, not lint levels
|
||||
116
.github/workflows/nickel-typecheck.yml
vendored
Normal file
@ -0,0 +1,116 @@
|
||||
# GitHub Actions Nickel Type Checking Workflow
|
||||
# Generated by dev-system/ci
|
||||
# Validates all Nickel schemas with nickel typecheck
|
||||
|
||||
name: Nickel Type Check
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main, develop]
|
||||
paths: ['**.ncl']
|
||||
pull_request:
|
||||
branches: [main]
|
||||
paths: ['**.ncl']
|
||||
|
||||
jobs:
|
||||
typecheck:
|
||||
name: Nickel Type Checking
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install Nickel
|
||||
run: |
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
echo "📦 Installing Nickel..."
|
||||
|
||||
if command -v nickel &> /dev/null; then
|
||||
echo "✓ Nickel already installed"
|
||||
nickel --version
|
||||
else
|
||||
echo "Installing via homebrew..."
|
||||
brew install nickel || {
|
||||
echo "Homebrew installation failed, trying from source..."
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://install.nickel-lang.org | bash || exit 1
|
||||
}
|
||||
fi
|
||||
|
||||
nickel --version
|
||||
|
||||
- name: Setup environment
|
||||
run: |
|
||||
#!/usr/bin/env bash
|
||||
# Set NICKEL_IMPORT_PATH for schema imports
|
||||
export NICKEL_IMPORT_PATH="/Users/Akasha/Tools/dev-system/ci/schemas:/Users/Akasha/Tools/dev-system/ci/validators:/Users/Akasha/Tools/dev-system/ci/defaults"
|
||||
echo "NICKEL_IMPORT_PATH=$NICKEL_IMPORT_PATH" >> $GITHUB_ENV
|
||||
|
||||
- name: Type check schemas
|
||||
run: |
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
echo "🔍 Type checking Nickel schemas..."
|
||||
|
||||
# Find all .ncl files
|
||||
SCHEMAS=$(find . -name "*.ncl" -type f \
|
||||
! -path "./target/*" \
|
||||
! -path "./.git/*" \
|
||||
! -path "./node_modules/*" \
|
||||
| sort)
|
||||
|
||||
if [ -z "$SCHEMAS" ]; then
|
||||
echo "⚠️ No Nickel schemas found"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
FAILED=0
|
||||
PASSED=0
|
||||
|
||||
# Set import path
|
||||
export NICKEL_IMPORT_PATH="/Users/Akasha/Tools/dev-system/ci/schemas:/Users/Akasha/Tools/dev-system/ci/validators:/Users/Akasha/Tools/dev-system/ci/defaults:."
|
||||
|
||||
for schema in $SCHEMAS; do
|
||||
echo "Checking: $schema"
|
||||
if nickel typecheck "$schema" > /dev/null 2>&1; then
|
||||
echo " ✓ Valid"
|
||||
((PASSED++))
|
||||
else
|
||||
echo " ❌ Type error"
|
||||
nickel typecheck "$schema" || true
|
||||
((FAILED++))
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "Summary: $PASSED passed, $FAILED failed"
|
||||
|
||||
if [ $FAILED -gt 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Export and validate
|
||||
run: |
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
echo "📊 Exporting Nickel configurations..."
|
||||
|
||||
export NICKEL_IMPORT_PATH="/Users/Akasha/Tools/dev-system/ci/schemas:/Users/Akasha/Tools/dev-system/ci/validators:/Users/Akasha/Tools/dev-system/ci/defaults:."
|
||||
|
||||
# Export main configs if they exist
|
||||
if [ -f ".typedialog/ci/schemas/ci-local.ncl" ]; then
|
||||
echo "Exporting CI config..."
|
||||
nickel export .typedialog/ci/schemas/ci-local.ncl > /tmp/ci-export.json
|
||||
if [ $? -eq 0 ]; then
|
||||
echo " ✓ Successfully exported"
|
||||
else
|
||||
echo " ❌ Export failed"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "✓ All exports successful"
|
||||
47
.github/workflows/rust-ci.yml
vendored
Normal file
@ -0,0 +1,47 @@
|
||||
jobs:
|
||||
audit:
|
||||
name: Security Audit
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Install Rust
|
||||
uses: dtolnay/rust-toolchain@stable
|
||||
- name: Audit
|
||||
run: cargo audit --deny warnings
|
||||
- name: Deny Check
|
||||
run: cargo deny check licenses advisories
|
||||
check:
|
||||
name: Check + Test + Lint
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Install Rust
|
||||
uses: dtolnay/rust-toolchain@master
|
||||
with:
|
||||
toolchain: ${{ matrix.rust-version }}
|
||||
- name: Cache
|
||||
uses: Swatinem/rust-cache@v2
|
||||
- name: Check
|
||||
run: cargo check --all-targets
|
||||
- name: Format Check
|
||||
run: cargo fmt --all -- --check
|
||||
- name: Clippy
|
||||
run: cargo clippy --all-targets -- -D warnings
|
||||
- name: Tests
|
||||
run: cargo test --workspace
|
||||
strategy:
|
||||
matrix:
|
||||
rust-version:
|
||||
- stable
|
||||
- nightly
|
||||
name: Rust CI
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- develop
|
||||
67
.gitignore
vendored
Normal file
@ -0,0 +1,67 @@
|
||||
CLAUDE.md
|
||||
.claude
|
||||
utils/save*sh
|
||||
COMMIT_MESSAGE.md
|
||||
.wrks
|
||||
nushell
|
||||
nushell-*
|
||||
*.tar.gz
|
||||
#*-nushell-plugins.tar.gz
|
||||
github-com
|
||||
.coder
|
||||
target
|
||||
distribution
|
||||
.qodo
|
||||
# enviroment to load on bin/build
|
||||
.env
|
||||
# OSX trash
|
||||
.DS_Store
|
||||
|
||||
# Vscode files
|
||||
.vscode
|
||||
|
||||
# Emacs save files
|
||||
*~
|
||||
\#*\#
|
||||
.\#*
|
||||
|
||||
# Vim-related files
|
||||
[._]*.s[a-w][a-z]
|
||||
[._]s[a-w][a-z]
|
||||
*.un~
|
||||
Session.vim
|
||||
.netrwhist
|
||||
|
||||
# cscope-related files
|
||||
cscope.*
|
||||
|
||||
# User cluster configs
|
||||
.kubeconfig
|
||||
|
||||
.tags*
|
||||
|
||||
# direnv .envrc files
|
||||
.envrc
|
||||
|
||||
# make-related metadata
|
||||
/.make/
|
||||
|
||||
# Just in time generated data in the source, should never be committed
|
||||
/test/e2e/generated/bindata.go
|
||||
|
||||
# This file used by some vendor repos (e.g. github.com/go-openapi/...) to store secret variables and should not be ignored
|
||||
!\.drone\.sec
|
||||
|
||||
# Godeps workspace
|
||||
/Godeps/_workspace
|
||||
|
||||
/bazel-*
|
||||
*.pyc
|
||||
|
||||
# generated by verify-vendor.sh
|
||||
vendordiff.patch
|
||||
.claude/settings.local.json
|
||||
|
||||
# Generated SBOM files
|
||||
SBOM.*.json
|
||||
*.sbom.json
|
||||
109
.markdownlint-cli2.jsonc
Normal file
@ -0,0 +1,109 @@
|
||||
// Markdownlint-cli2 Configuration
|
||||
// Documentation quality enforcement for technical projects
|
||||
// See: https://github.com/DavidAnson/markdownlint-cli2
|
||||
// Generated by dev-system/ci
|
||||
|
||||
{
|
||||
"config": {
|
||||
"default": true,
|
||||
|
||||
// Headings - enforce proper hierarchy
|
||||
"MD001": false, // heading-increment (relaxed - allow flexibility)
|
||||
"MD026": { "punctuation": ".,;:!?" }, // heading-punctuation
|
||||
|
||||
// Lists - enforce consistency
|
||||
"MD004": { "style": "consistent" }, // ul-style (consistent list markers)
|
||||
"MD005": false, // inconsistent-indentation (relaxed)
|
||||
"MD007": { "indent": 2 }, // ul-indent
|
||||
"MD029": false, // ol-prefix (allow flexible list numbering)
|
||||
"MD030": { "ul_single": 1, "ol_single": 1, "ul_multi": 1, "ol_multi": 1 },
|
||||
|
||||
// Code blocks - fenced only
|
||||
"MD046": { "style": "fenced" }, // code-block-style
|
||||
|
||||
// CRITICAL: MD040 only checks opening fences, NOT closing fences
|
||||
// It does NOT catch malformed closing fences with language specifiers (e.g., ```plaintext)
|
||||
// CommonMark spec requires closing fences to be ``` only (no language)
|
||||
// Use separate validation script to check closing fences
|
||||
"MD040": true, // fenced-code-language (code blocks need language on OPENING fence)
|
||||
|
||||
// Formatting - strict whitespace
|
||||
"MD009": true, // no-hard-tabs
|
||||
"MD010": true, // hard-tabs
|
||||
"MD011": true, // reversed-link-syntax
|
||||
"MD018": true, // no-missing-space-atx
|
||||
"MD019": true, // no-multiple-space-atx
|
||||
"MD020": true, // no-missing-space-closed-atx
|
||||
"MD021": true, // no-multiple-space-closed-atx
|
||||
"MD023": true, // heading-starts-line
|
||||
"MD027": true, // no-multiple-spaces-blockquote
|
||||
"MD037": true, // no-space-in-emphasis
|
||||
"MD039": true, // no-space-in-links
|
||||
|
||||
// Trailing content
|
||||
"MD012": false, // no-multiple-blanks (relaxed - allow formatting space)
|
||||
"MD024": false, // no-duplicate-heading (too strict for docs)
|
||||
"MD028": false, // no-blanks-blockquote (relaxed)
|
||||
"MD047": true, // single-trailing-newline
|
||||
|
||||
// Links and references
|
||||
"MD034": true, // no-bare-urls (links must be formatted)
|
||||
"MD042": true, // no-empty-links
|
||||
|
||||
// HTML - allow for documentation formatting and images
|
||||
"MD033": { "allowed_elements": ["br", "hr", "details", "summary", "p", "img"] },
|
||||
|
||||
// Line length - relaxed for technical documentation
|
||||
"MD013": {
|
||||
"line_length": 150,
|
||||
"heading_line_length": 150,
|
||||
"code_block_line_length": 150,
|
||||
"code_blocks": true,
|
||||
"tables": true,
|
||||
"headers": true,
|
||||
"headers_line_length": 150,
|
||||
"strict": false,
|
||||
"stern": false
|
||||
},
|
||||
|
||||
// Images
|
||||
"MD045": true, // image-alt-text
|
||||
|
||||
// Tables - enforce proper formatting
|
||||
"MD060": true, // table-column-style (proper spacing: | ---- | not |------|)
|
||||
|
||||
// Disable rules that conflict with relaxed style
|
||||
"MD003": false, // consistent-indentation
|
||||
"MD041": false, // first-line-heading
|
||||
"MD025": false, // single-h1 / multiple-top-level-headings
|
||||
"MD022": false, // blanks-around-headings (flexible spacing)
|
||||
"MD032": false, // blanks-around-lists (flexible spacing)
|
||||
"MD035": false, // hr-style (consistent)
|
||||
"MD036": false, // no-emphasis-as-heading
|
||||
"MD044": false // proper-names
|
||||
},
|
||||
|
||||
// Documentation patterns
|
||||
"globs": [
|
||||
"**/*.md",
|
||||
"!node_modules/**",
|
||||
"!target/**",
|
||||
"!.git/**",
|
||||
"!build/**",
|
||||
"!dist/**"
|
||||
],
|
||||
|
||||
// Ignore build artifacts, external content, and operational directories
|
||||
"ignores": [
|
||||
"node_modules/**",
|
||||
"target/**",
|
||||
".git/**",
|
||||
"build/**",
|
||||
"dist/**",
|
||||
".coder/**",
|
||||
".claude/**",
|
||||
".wrks/**",
|
||||
".vale/**",
|
||||
"vendor/**"
|
||||
]
|
||||
}
|
||||
128
.pre-commit-config.yaml
Normal file
@ -0,0 +1,128 @@
|
||||
# Pre-commit Framework Configuration
|
||||
# Generated by dev-system/ci
|
||||
# Configures git pre-commit hooks for Rust projects
|
||||
|
||||
repos:
|
||||
# ============================================================================
|
||||
# Rust Hooks
|
||||
# ============================================================================
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: rust-fmt
|
||||
name: Rust formatting (cargo +nightly fmt)
|
||||
entry: bash -c 'cargo +nightly fmt --all -- --check'
|
||||
language: system
|
||||
types: [rust]
|
||||
pass_filenames: false
|
||||
stages: [pre-commit]
|
||||
|
||||
- id: rust-clippy
|
||||
name: Rust linting (cargo clippy)
|
||||
entry: bash -c 'cargo clippy --all-targets -- -D warnings'
|
||||
language: system
|
||||
types: [rust]
|
||||
pass_filenames: false
|
||||
stages: [pre-commit]
|
||||
|
||||
- id: rust-test
|
||||
name: Rust tests
|
||||
entry: bash -c 'cargo test --workspace'
|
||||
language: system
|
||||
types: [rust]
|
||||
pass_filenames: false
|
||||
stages: [pre-push]
|
||||
|
||||
- id: cargo-deny
|
||||
name: Cargo deny (licenses & advisories)
|
||||
entry: bash -c 'cargo deny check licenses advisories'
|
||||
language: system
|
||||
pass_filenames: false
|
||||
stages: [pre-push]
|
||||
|
||||
# ============================================================================
|
||||
# Nushell Hooks (optional - enable if using Nushell)
|
||||
# ============================================================================
|
||||
# - repo: local
|
||||
# hooks:
|
||||
# - id: nushell-check
|
||||
# name: Nushell validation (nu --ide-check)
|
||||
# entry: >-
|
||||
# bash -c 'for f in $(git diff --cached --name-only --diff-filter=ACM | grep "\.nu$"); do
|
||||
# echo "Checking: $f"; nu --ide-check 100 "$f" || exit 1; done'
|
||||
# language: system
|
||||
# types: [file]
|
||||
# files: \.nu$
|
||||
# pass_filenames: false
|
||||
# stages: [pre-commit]
|
||||
|
||||
# ============================================================================
|
||||
# Nickel Hooks (optional - enable if using Nickel)
|
||||
# ============================================================================
|
||||
# - repo: local
|
||||
# hooks:
|
||||
# - id: nickel-typecheck
|
||||
# name: Nickel type checking
|
||||
# entry: >-
|
||||
# bash -c 'export NICKEL_IMPORT_PATH="../:."; for f in $(git diff --cached --name-only --diff-filter=ACM | grep "\.ncl$"); do
|
||||
# echo "Checking: $f"; nickel typecheck "$f" || exit 1; done'
|
||||
# language: system
|
||||
# types: [file]
|
||||
# files: \.ncl$
|
||||
# pass_filenames: false
|
||||
# stages: [pre-commit]
|
||||
|
||||
# ============================================================================
|
||||
# Bash Hooks (optional - enable if using Bash)
|
||||
# ============================================================================
|
||||
# - repo: local
|
||||
# hooks:
|
||||
# - id: shellcheck
|
||||
# name: Shellcheck (bash linting)
|
||||
# entry: shellcheck
|
||||
# language: system
|
||||
# types: [shell]
|
||||
# stages: [pre-commit]
|
||||
#
|
||||
# - id: shfmt
|
||||
# name: Shell script formatting
|
||||
# entry: bash -c 'shfmt -i 2 -d'
|
||||
# language: system
|
||||
# types: [shell]
|
||||
# stages: [pre-commit]
|
||||
|
||||
# ============================================================================
|
||||
# Markdown Hooks (RECOMMENDED - enable for documentation quality)
|
||||
# ============================================================================
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: markdownlint
|
||||
name: Markdown linting (markdownlint-cli2)
|
||||
entry: markdownlint-cli2
|
||||
language: system
|
||||
types: [markdown]
|
||||
stages: [pre-commit]
|
||||
|
||||
# ============================================================================
|
||||
# General Pre-commit Hooks
|
||||
# ============================================================================
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v4.5.0
|
||||
hooks:
|
||||
- id: check-added-large-files
|
||||
args: ['--maxkb=1000']
|
||||
|
||||
- id: check-case-conflict
|
||||
|
||||
- id: check-merge-conflict
|
||||
|
||||
- id: check-toml
|
||||
|
||||
- id: check-yaml
|
||||
exclude: ^\.woodpecker/
|
||||
|
||||
- id: end-of-file-fixer
|
||||
|
||||
- id: trailing-whitespace
|
||||
exclude: \.md$
|
||||
|
||||
- id: mixed-line-ending
|
||||
53
.rustfmt.toml
Normal file
@ -0,0 +1,53 @@
|
||||
# Generated by dev-system/ci
|
||||
# Rustfmt configuration for consistent Rust code formatting
|
||||
# Configured for cargo +nightly fmt with advanced features enabled
|
||||
|
||||
# Basic formatting options
|
||||
edition = "2021"
|
||||
max_width = 100
|
||||
hard_tabs = false
|
||||
tab_spaces = 4
|
||||
newline_style = "Unix"
|
||||
|
||||
# Code structure
|
||||
use_small_heuristics = "Default"
|
||||
|
||||
# Imports
|
||||
reorder_imports = true
|
||||
reorder_modules = true
|
||||
remove_nested_parens = true
|
||||
group_imports = "StdExternalCrate"
|
||||
|
||||
# Match expressions
|
||||
match_block_trailing_comma = false
|
||||
|
||||
# Chains
|
||||
chain_width = 60
|
||||
|
||||
# Comment formatting (nightly)
|
||||
comment_width = 80
|
||||
wrap_comments = true
|
||||
normalize_comments = true
|
||||
normalize_doc_attributes = true
|
||||
|
||||
# Spaces and indentation (nightly)
|
||||
fn_single_line = false
|
||||
fn_params_layout = "Tall"
|
||||
where_single_line = false
|
||||
|
||||
# Formatting (nightly)
|
||||
format_strings = true
|
||||
format_code_in_doc_comments = false
|
||||
|
||||
# Spaces (nightly)
|
||||
space_before_colon = false
|
||||
space_after_colon = true
|
||||
spaces_around_ranges = false
|
||||
|
||||
# Line breaks (nightly)
|
||||
match_arm_blocks = true
|
||||
blank_lines_lower_bound = 0
|
||||
blank_lines_upper_bound = 1
|
||||
|
||||
# Enable nightly features
|
||||
unstable_features = true
|
||||
40
.shellcheckrc
Normal file
@ -0,0 +1,40 @@
|
||||
# ShellCheck Configuration Template
|
||||
# Bash/shell script linting configuration
|
||||
# Generated by dev-system/ci
|
||||
# Location: .shellcheckrc
|
||||
|
||||
|
||||
# Generated by dev-system/ci
|
||||
# ShellCheck configuration for Bash script validation
|
||||
|
||||
# Enable all optional checks
|
||||
enable=all
|
||||
|
||||
# Disable specific checks that are too strict
|
||||
# SC1091 - Not following sourced files (noisy in monorepos)
|
||||
# disable=SC1091
|
||||
|
||||
# Source path for sourced files
|
||||
source-path=SCRIPTDIR
|
||||
|
||||
# Severity levels: error, warning, info, style
|
||||
severity=warning
|
||||
|
||||
# Format: gcc, json, json1, quiet
|
||||
format=gcc
|
||||
|
||||
# Exit status thresholds
|
||||
# 0: All checks passed
|
||||
# 1: Warning found
|
||||
# 2: Error found
|
||||
|
||||
# Shell dialect (bash, sh, ksh, etc)
|
||||
# shell=bash
|
||||
|
||||
# Check style guide compliance
|
||||
# These are considered good practices but optional
|
||||
|
||||
# Common problematic patterns
|
||||
# SC2086 - Double quote to prevent globbing
|
||||
# SC2181 - Check exit code explicitly
|
||||
# SC2207 - Array from command substitution
|
||||
49
.taplo.toml
Normal file
@ -0,0 +1,49 @@
|
||||
# Taplo configuration for TOML formatting and linting
|
||||
# https://taplo.tamasfe.dev/configuration/
|
||||
|
||||
[formatting]
|
||||
# Indent tables with 2 spaces
|
||||
indent_string = " "
|
||||
indent_tables = true
|
||||
|
||||
# Reorder keys alphabetically within tables
|
||||
reorder_keys = true
|
||||
|
||||
# Reorder arrays to be more readable
|
||||
reorder_arrays = false
|
||||
|
||||
# Align entries vertically in inline tables
|
||||
align_entries = false
|
||||
|
||||
# Allow compact inline tables
|
||||
allowed_blank_lines = 1
|
||||
|
||||
# Trailing newline
|
||||
trailing_newline = true
|
||||
|
||||
# Column width for wrapping
|
||||
column_width = 100
|
||||
|
||||
# Compact arrays
|
||||
compact_arrays = true
|
||||
|
||||
# Compact inline tables
|
||||
compact_inline_tables = false
|
||||
|
||||
# === INCLUDE/EXCLUDE PATTERNS ===
|
||||
|
||||
include = ["Cargo.toml", "*/Cargo.toml", "config/**/*.toml", "**/*.toml"]
|
||||
|
||||
exclude = ["target/**", "node_modules/**", ".git/**"]
|
||||
|
||||
# === SCHEMA VALIDATION ===
|
||||
|
||||
# Cargo.toml schema validation
|
||||
[[rule]]
|
||||
include = ["**/Cargo.toml"]
|
||||
# Taplo includes built-in Cargo.toml schema
|
||||
|
||||
# TypeDialog form definition TOML files
|
||||
[[rule]]
|
||||
include = ["**/.typedialog/**/*.toml", "config/**/forms/*.toml", "tests/fixtures/**/*.toml"]
|
||||
keys = ["name", "description", "fields", "items", "elements"]
|
||||
316
.typedialog/ci/README.md
Normal file
@ -0,0 +1,316 @@
|
||||
# CI System - Configuration Guide
|
||||
|
||||
**Installed**: 2026-01-22
|
||||
**Detected Languages**: markdown
|
||||
|
||||
---
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Option 1: Using configure.sh (Recommended)
|
||||
|
||||
A convenience script is installed in `.typedialog/ci/`:
|
||||
|
||||
```bash
|
||||
# Use web backend (default) - Opens in browser
|
||||
.typedialog/ci/configure.sh
|
||||
|
||||
# Use TUI backend - Terminal interface
|
||||
.typedialog/ci/configure.sh tui
|
||||
|
||||
# Use CLI backend - Command-line prompts
|
||||
.typedialog/ci/configure.sh cli
|
||||
```
|
||||
|
||||
**This script automatically:**
|
||||
- Sources `.typedialog/ci/envrc` for environment setup
|
||||
- Loads defaults from `config.ncl` (Nickel format)
|
||||
- Uses cascading search for fragments (local → Tools)
|
||||
- Creates backup before overwriting existing config
|
||||
- Saves output in Nickel format using nickel-roundtrip with documented template
|
||||
- Generates `config.ncl` compatible with `nickel doc` command
|
||||
|
||||
### Option 2: Direct TypeDialog Commands
|
||||
|
||||
Use TypeDialog nickel-roundtrip directly with manual paths:
|
||||
|
||||
#### Web Backend (Recommended - Easy Viewing)
|
||||
|
||||
```bash
|
||||
cd .typedialog/ci # Change to CI directory
|
||||
source envrc # Load environment
|
||||
typedialog-web nickel-roundtrip config.ncl form.toml \
|
||||
--output config.ncl \
|
||||
--ncl-template $TOOLS_PATH/dev-system/ci/templates/config.ncl.j2
|
||||
```
|
||||
|
||||
#### TUI Backend
|
||||
|
||||
```bash
|
||||
cd .typedialog/ci
|
||||
source envrc
|
||||
typedialog-tui nickel-roundtrip config.ncl form.toml \
|
||||
--output config.ncl \
|
||||
--ncl-template $TOOLS_PATH/dev-system/ci/templates/config.ncl.j2
|
||||
```
|
||||
|
||||
#### CLI Backend
|
||||
|
||||
```bash
|
||||
cd .typedialog/ci
|
||||
source envrc
|
||||
typedialog nickel-roundtrip config.ncl form.toml \
|
||||
--output config.ncl \
|
||||
--ncl-template $TOOLS_PATH/dev-system/ci/templates/config.ncl.j2
|
||||
```
|
||||
|
||||
**Note:** The `--ncl-template` flag uses a Tera template that adds:
|
||||
- Descriptive comments for each section
|
||||
- Documentation compatible with `nickel doc config.ncl`
|
||||
- Consistent formatting and structure
|
||||
|
||||
**All backends will:**
|
||||
- Show only options relevant to your detected languages
|
||||
- Guide you through all configuration choices
|
||||
- Validate your inputs
|
||||
- Generate config.ncl in Nickel format
|
||||
|
||||
### Option 3: Manual Configuration
|
||||
|
||||
Edit `config.ncl` directly:
|
||||
|
||||
```bash
|
||||
vim .typedialog/ci/config.ncl
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Configuration Format: Nickel
|
||||
|
||||
**This project uses Nickel format by default** for all configuration files.
|
||||
|
||||
### Why Nickel?
|
||||
|
||||
- ✅ **Typed configuration** - Static type checking with `nickel typecheck`
|
||||
- ✅ **Documentation** - Generate docs with `nickel doc config.ncl`
|
||||
- ✅ **Validation** - Built-in schema validation
|
||||
- ✅ **Comments** - Rich inline documentation support
|
||||
- ✅ **Modular** - Import/export system for reusable configs
|
||||
|
||||
### Nickel Template
|
||||
|
||||
The output structure is controlled by a **Tera template** at:
|
||||
- **Tools default**: `$TOOLS_PATH/dev-system/ci/templates/config.ncl.j2`
|
||||
- **Local override**: `.typedialog/ci/config.ncl.j2` (optional)
|
||||
|
||||
**To customize the template:**
|
||||
|
||||
```bash
|
||||
# Copy the default template
|
||||
cp $TOOLS_PATH/dev-system/ci/templates/config.ncl.j2 \
|
||||
.typedialog/ci/config.ncl.j2
|
||||
|
||||
# Edit to add custom comments, documentation, or structure
|
||||
vim .typedialog/ci/config.ncl.j2
|
||||
|
||||
# Your template will now be used automatically
|
||||
```
|
||||
|
||||
**Template features:**
|
||||
- Customizable comments per section
|
||||
- Control field ordering
|
||||
- Add project-specific documentation
|
||||
- Configure output for `nickel doc` command
|
||||
|
||||
### TypeDialog Environment Variables
|
||||
|
||||
You can customize TypeDialog behavior with environment variables:
|
||||
|
||||
```bash
|
||||
# Web server configuration
|
||||
export TYPEDIALOG_PORT=9000 # Port for web backend (default: 9000)
|
||||
export TYPEDIALOG_HOST=localhost # Host binding (default: localhost)
|
||||
|
||||
# Localization
|
||||
export TYPEDIALOG_LANG=en_US.UTF-8 # Form language (default: system locale)
|
||||
|
||||
# Run with custom settings
|
||||
TYPEDIALOG_PORT=8080 .typedialog/ci/configure.sh web
|
||||
```
|
||||
|
||||
**Common use cases:**
|
||||
|
||||
```bash
|
||||
# Access from other machines in network
|
||||
TYPEDIALOG_HOST=0.0.0.0 TYPEDIALOG_PORT=8080 .typedialog/ci/configure.sh web
|
||||
|
||||
# Use different port if 9000 is busy
|
||||
TYPEDIALOG_PORT=3000 .typedialog/ci/configure.sh web
|
||||
|
||||
# Spanish interface
|
||||
TYPEDIALOG_LANG=es_ES.UTF-8 .typedialog/ci/configure.sh web
|
||||
```
|
||||
|
||||
## Configuration Structure
|
||||
|
||||
Your config.ncl is organized in the `ci` namespace (Nickel format):
|
||||
|
||||
```nickel
|
||||
{
|
||||
ci = {
|
||||
project = {
|
||||
name = "markdown",
|
||||
detected_languages = ["markdown"],
|
||||
primary_language = "markdown",
|
||||
},
|
||||
tools = {
|
||||
# Tools are added based on detected languages
|
||||
},
|
||||
features = {
|
||||
# CI features (pre-commit, GitHub Actions, etc.)
|
||||
},
|
||||
ci_providers = {
|
||||
# CI provider configurations
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
## Available Fragments
|
||||
|
||||
Tool configurations are modular. Check `.typedialog/ci/fragments/` for:
|
||||
|
||||
- markdown-tools.toml - Tools for markdown
|
||||
- general-tools.toml - Cross-language tools
|
||||
- ci-providers.toml - GitHub Actions, Woodpecker, etc.
|
||||
|
||||
## Cascading Override System
|
||||
|
||||
This project uses a **local → Tools cascading search** for all resources:
|
||||
|
||||
### How It Works
|
||||
|
||||
Resources are searched in priority order:
|
||||
|
||||
1. **Local files** (`.typedialog/ci/`) - **FIRST** (highest priority)
|
||||
2. **Tools files** (`$TOOLS_PATH/dev-system/ci/`) - **FALLBACK** (default)
|
||||
|
||||
### Affected Resources
|
||||
|
||||
| Resource | Local Path | Tools Path |
|
||||
|----------|------------|------------|
|
||||
| Fragments | `.typedialog/ci/fragments/` | `$TOOLS_PATH/dev-system/ci/forms/fragments/` |
|
||||
| Schemas | `.typedialog/ci/schemas/` | `$TOOLS_PATH/dev-system/ci/schemas/` |
|
||||
| Validators | `.typedialog/ci/validators/` | `$TOOLS_PATH/dev-system/ci/validators/` |
|
||||
| Defaults | `.typedialog/ci/defaults/` | `$TOOLS_PATH/dev-system/ci/defaults/` |
|
||||
| Nickel Template | `.typedialog/ci/config.ncl.j2` | `$TOOLS_PATH/dev-system/ci/templates/config.ncl.j2` |
|
||||
|
||||
### Environment Setup (.envrc)
|
||||
|
||||
The `.typedialog/ci/.envrc` file configures search paths:
|
||||
|
||||
```bash
|
||||
# Source this file to load environment
|
||||
source .typedialog/ci/.envrc
|
||||
|
||||
# Or use direnv for automatic loading
|
||||
echo 'source .typedialog/ci/.envrc' >> .envrc
|
||||
```
|
||||
|
||||
**What's in .envrc:**
|
||||
|
||||
```bash
|
||||
export NICKEL_IMPORT_PATH="schemas:$TOOLS_PATH/dev-system/ci/schemas:validators:..."
|
||||
export TYPEDIALOG_FRAGMENT_PATH=".:$TOOLS_PATH/dev-system/ci/forms"
|
||||
export NCL_TEMPLATE="<local or Tools path to config.ncl.j2>"
|
||||
export TYPEDIALOG_PORT=9000 # Web server port
|
||||
export TYPEDIALOG_HOST=localhost # Web server host
|
||||
export TYPEDIALOG_LANG="${LANG}" # Form localization
|
||||
```
|
||||
|
||||
### Creating Overrides
|
||||
|
||||
**By default:** All resources come from Tools (no duplication).
|
||||
|
||||
**To customize:** Create file in local directory with same name:
|
||||
|
||||
```bash
|
||||
# Override a fragment
|
||||
cp $TOOLS_PATH/dev-system/ci/fragments/rust-tools.toml \
|
||||
.typedialog/ci/fragments/rust-tools.toml
|
||||
|
||||
# Edit your local version
|
||||
vim .typedialog/ci/fragments/rust-tools.toml
|
||||
|
||||
# Override Nickel template (customize comments, structure, nickel doc output)
|
||||
cp $TOOLS_PATH/dev-system/ci/templates/config.ncl.j2 \
|
||||
.typedialog/ci/config.ncl.j2
|
||||
|
||||
# Edit to customize documentation and structure
|
||||
vim .typedialog/ci/config.ncl.j2
|
||||
|
||||
# Now your version will be used instead of Tools version
|
||||
```
|
||||
|
||||
**Benefits:**
|
||||
|
||||
- ✅ Override only what you need
|
||||
- ✅ Everything else stays synchronized with Tools
|
||||
- ✅ No duplication by default
|
||||
- ✅ Automatic updates when Tools is updated
|
||||
|
||||
**See:** `$TOOLS_PATH/dev-system/ci/docs/cascade-override.md` for complete documentation.
|
||||
|
||||
## Testing Your Configuration
|
||||
|
||||
### Validate Configuration
|
||||
|
||||
```bash
|
||||
nu $env.TOOLS_PATH/dev-system/ci/scripts/validator.nu \
|
||||
--config .typedialog/ci/config.ncl \
|
||||
--project . \
|
||||
--namespace ci
|
||||
```
|
||||
|
||||
### Regenerate CI Files
|
||||
|
||||
```bash
|
||||
nu $env.TOOLS_PATH/dev-system/ci/scripts/generate-configs.nu \
|
||||
--config .typedialog/ci/config.ncl \
|
||||
--templates $env.TOOLS_PATH/dev-system/ci/templates \
|
||||
--output . \
|
||||
--namespace ci
|
||||
```
|
||||
|
||||
## Common Tasks
|
||||
|
||||
### Add a New Tool
|
||||
|
||||
Edit `config.ncl` and add under `ci.tools`:
|
||||
|
||||
```nickel
|
||||
{
|
||||
ci = {
|
||||
tools = {
|
||||
newtool = {
|
||||
enabled = true,
|
||||
install_method = "cargo",
|
||||
version = "latest",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
### Disable a Feature
|
||||
|
||||
```toml
|
||||
[ci.features]
|
||||
enable_pre_commit = false
|
||||
```
|
||||
|
||||
## Need Help?
|
||||
|
||||
For detailed documentation, see:
|
||||
- $env.TOOLS_PATH/dev-system/ci/docs/configuration-guide.md
|
||||
- $env.TOOLS_PATH/dev-system/ci/docs/installation-guide.md
|
||||
203
.typedialog/ci/config.ncl
Normal file
@ -0,0 +1,203 @@
|
||||
# CI Configuration - Nickel Format
|
||||
# Auto-generated by dev-system CI installer
|
||||
#
|
||||
# This file is managed by TypeDialog using nickel-roundtrip.
|
||||
# Edit via: .typedialog/ci/configure.sh
|
||||
# Or manually edit and validate with: nickel typecheck config.ncl
|
||||
#
|
||||
# Documentation: nickel doc config.ncl
|
||||
|
||||
{
|
||||
# CI namespace - all configuration lives under 'ci'
|
||||
ci = {
|
||||
# Project Information
|
||||
# Detected languages and primary language for this project
|
||||
project = {
|
||||
# Project name
|
||||
name = "",
|
||||
# Project description
|
||||
description = "",
|
||||
# Project website or documentation site URL
|
||||
site_url = "",
|
||||
# Project repository URL (GitHub, GitLab, etc.)
|
||||
repo_url = "",
|
||||
# Languages detected in codebase (auto-detected by installer)
|
||||
detected_languages = [
|
||||
"rust",
|
||||
"markdown",
|
||||
"nickel"
|
||||
],
|
||||
# Primary language (determines default tooling)
|
||||
primary_language = "rust",
|
||||
},
|
||||
|
||||
# CI Tools Configuration
|
||||
# Each tool can be enabled/disabled and configured here
|
||||
tools = {
|
||||
# Taplo - TOML formatter and linter
|
||||
taplo = {
|
||||
enabled = true,
|
||||
install_method = "cargo",
|
||||
},
|
||||
# YAMLlint - YAML formatter and linter
|
||||
yamllint = {
|
||||
enabled = true,
|
||||
install_method = "pip",
|
||||
},
|
||||
# Clippy - Rust linting tool
|
||||
clippy = {
|
||||
enabled = true,
|
||||
install_method = "cargo",
|
||||
deny_warnings = true,
|
||||
},
|
||||
# Cargo Audit - Security vulnerability scanner
|
||||
audit = {
|
||||
enabled = true,
|
||||
install_method = "cargo",
|
||||
},
|
||||
# Cargo Deny - Dependency checker
|
||||
deny = {
|
||||
enabled = true,
|
||||
install_method = "cargo",
|
||||
},
|
||||
# Cargo SBOM - Software Bill of Materials
|
||||
sbom = {
|
||||
enabled = true,
|
||||
install_method = "cargo",
|
||||
},
|
||||
# LLVM Coverage - Code coverage tool
|
||||
llvm-cov = {
|
||||
enabled = true,
|
||||
install_method = "cargo",
|
||||
},
|
||||
# Shellcheck - Bash/shell script linter
|
||||
shellcheck = {
|
||||
enabled = true,
|
||||
install_method = "brew",
|
||||
},
|
||||
# Shfmt - Shell script formatter
|
||||
shfmt = {
|
||||
enabled = true,
|
||||
install_method = "brew",
|
||||
},
|
||||
# Markdownlint - Markdown linter
|
||||
markdownlint = {
|
||||
enabled = true,
|
||||
install_method = "npm",
|
||||
},
|
||||
# Vale - Prose linter
|
||||
vale = {
|
||||
enabled = true,
|
||||
install_method = "brew",
|
||||
},
|
||||
# Nickel - Configuration language type checker
|
||||
nickel = {
|
||||
enabled = true,
|
||||
install_method = "brew",
|
||||
check_all = true,
|
||||
},
|
||||
# NuShell - Shell script validator
|
||||
nushell = {
|
||||
enabled = true,
|
||||
install_method = "builtin",
|
||||
check_all = true,
|
||||
},
|
||||
# Ruff - Fast Python linter
|
||||
ruff = {
|
||||
enabled = true,
|
||||
install_method = "pip",
|
||||
},
|
||||
# Black - Python code formatter
|
||||
black = {
|
||||
enabled = true,
|
||||
install_method = "pip",
|
||||
},
|
||||
# Mypy - Python static type checker
|
||||
mypy = {
|
||||
enabled = false,
|
||||
install_method = "pip",
|
||||
},
|
||||
# Pytest - Python testing framework
|
||||
pytest = {
|
||||
enabled = true,
|
||||
install_method = "pip",
|
||||
},
|
||||
# Golangci-lint - Go linter aggregator
|
||||
"golangci-lint" = {
|
||||
enabled = true,
|
||||
install_method = "brew",
|
||||
},
|
||||
# Gofmt - Go code formatter
|
||||
gofmt = {
|
||||
enabled = true,
|
||||
install_method = "builtin",
|
||||
},
|
||||
# Staticcheck - Go static analysis
|
||||
staticcheck = {
|
||||
enabled = true,
|
||||
install_method = "brew",
|
||||
},
|
||||
# Gosec - Go security checker
|
||||
gosec = {
|
||||
enabled = false,
|
||||
install_method = "brew",
|
||||
},
|
||||
# ESLint - JavaScript linter
|
||||
eslint = {
|
||||
enabled = true,
|
||||
install_method = "npm",
|
||||
},
|
||||
# Prettier - Code formatter
|
||||
prettier = {
|
||||
enabled = true,
|
||||
install_method = "npm",
|
||||
},
|
||||
# TypeScript - Type checking
|
||||
typescript = {
|
||||
enabled = false,
|
||||
install_method = "npm",
|
||||
},
|
||||
# Jest - JavaScript testing framework
|
||||
jest = {
|
||||
enabled = true,
|
||||
install_method = "npm",
|
||||
},
|
||||
},
|
||||
|
||||
# CI Features
|
||||
# High-level feature flags for CI behavior
|
||||
features = {
|
||||
enable_ci_cd = true,
|
||||
enable_pre_commit = true,
|
||||
generate_taplo_config = true,
|
||||
generate_contributing = true,
|
||||
generate_security = true,
|
||||
generate_code_of_conduct = true,
|
||||
generate_dockerfiles = true,
|
||||
enable_cross_compilation = true,
|
||||
},
|
||||
|
||||
# CI Provider Configurations
|
||||
# Settings for GitHub Actions, Woodpecker, GitLab CI, etc.
|
||||
ci_providers = {
|
||||
# GitHub Actions
|
||||
github_actions = {
|
||||
enabled = true,
|
||||
branches_push = "main,develop",
|
||||
branches_pr = "main",
|
||||
},
|
||||
# Woodpecker CI
|
||||
woodpecker = {
|
||||
enabled = true,
|
||||
},
|
||||
},
|
||||
|
||||
# CI Settings
|
||||
settings = {
|
||||
parallel_jobs = 1,
|
||||
job_timeout_minutes = 1,
|
||||
require_status_checks = true,
|
||||
run_on_draft_prs = true,
|
||||
},
|
||||
},
|
||||
}
|
||||
116
.typedialog/ci/configure.sh
Executable file
@ -0,0 +1,116 @@
|
||||
#!/usr/bin/env bash
|
||||
# CI Configuration Script
|
||||
# Auto-generated by dev-system/ci installer
|
||||
#
|
||||
# Interactive configuration for CI tools using TypeDialog.
|
||||
# Uses Nickel format for configuration files.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
TYPEDIALOG_CI="${SCRIPT_DIR}"
|
||||
|
||||
# Source envrc to load fragment paths and other environment variables
|
||||
if [[ -f "${TYPEDIALOG_CI}/envrc" ]]; then
|
||||
# shellcheck source=/dev/null
|
||||
source "${TYPEDIALOG_CI}/envrc"
|
||||
fi
|
||||
|
||||
# Configuration files
|
||||
FORM_FILE="${TYPEDIALOG_CI}/form.toml"
|
||||
CONFIG_FILE="${TYPEDIALOG_CI}/config.ncl"
|
||||
|
||||
# NCL_TEMPLATE is set by envrc (cascading: local → Tools)
|
||||
# If not set, use default from Tools
|
||||
NCL_TEMPLATE="${NCL_TEMPLATE:-${TOOLS_PATH}/dev-system/ci/templates/config.ncl.j2}"
|
||||
|
||||
# TypeDialog environment variables (can be overridden)
|
||||
# Port for web backend (default: 9000)
|
||||
export TYPEDIALOG_PORT="${TYPEDIALOG_PORT:-9000}"
|
||||
|
||||
# Host for web backend (default: localhost)
|
||||
export TYPEDIALOG_HOST="${TYPEDIALOG_HOST:-localhost}"
|
||||
|
||||
# Locale for form localization (default: system locale)
|
||||
export TYPEDIALOG_LANG="${TYPEDIALOG_LANG:-${LANG:-en_US.UTF-8}}"
|
||||
|
||||
# Detect which TypeDialog backend to use (default: web)
|
||||
BACKEND="${1:-web}"
|
||||
|
||||
# Validate backend
|
||||
case "$BACKEND" in
|
||||
cli|tui|web)
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 [cli|tui|web]"
|
||||
echo ""
|
||||
echo "Launches TypeDialog for interactive CI configuration."
|
||||
echo "Backend options:"
|
||||
echo " cli - Command-line interface (simple prompts)"
|
||||
echo " tui - Terminal UI (interactive panels)"
|
||||
echo " web - Web server (browser-based) [default]"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# Check if form exists
|
||||
if [[ ! -f "$FORM_FILE" ]]; then
|
||||
echo "Error: Form file not found: $FORM_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Create backup if config exists
|
||||
if [[ -f "$CONFIG_FILE" ]]; then
|
||||
BACKUP="${CONFIG_FILE}.$(date +%Y%m%d_%H%M%S).bak"
|
||||
cp "$CONFIG_FILE" "$BACKUP"
|
||||
echo "ℹ️ Backed up existing config to: $(basename "$BACKUP")"
|
||||
fi
|
||||
|
||||
# Launch TypeDialog with Nickel roundtrip (preserves Nickel format)
|
||||
echo "🔧 Launching TypeDialog ($BACKEND backend)..."
|
||||
echo ""
|
||||
|
||||
# Show web server info if using web backend
|
||||
if [[ "$BACKEND" == "web" ]]; then
|
||||
echo "🌐 Web server will start on: http://${TYPEDIALOG_HOST}:${TYPEDIALOG_PORT}"
|
||||
echo " (Override with: TYPEDIALOG_PORT=8080 TYPEDIALOG_HOST=0.0.0.0 $0)"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# Build nickel-roundtrip command with optional template
|
||||
NCL_TEMPLATE_ARG=""
|
||||
if [[ -f "$NCL_TEMPLATE" ]]; then
|
||||
NCL_TEMPLATE_ARG="--ncl-template $NCL_TEMPLATE"
|
||||
echo "ℹ️ Using Nickel template: $NCL_TEMPLATE"
|
||||
fi
|
||||
|
||||
case "$BACKEND" in
|
||||
cli)
|
||||
typedialog nickel-roundtrip "$CONFIG_FILE" "$FORM_FILE" --output "$CONFIG_FILE" $NCL_TEMPLATE_ARG
|
||||
;;
|
||||
tui)
|
||||
typedialog-tui nickel-roundtrip "$CONFIG_FILE" "$FORM_FILE" --output "$CONFIG_FILE" $NCL_TEMPLATE_ARG
|
||||
;;
|
||||
web)
|
||||
typedialog-web nickel-roundtrip "$CONFIG_FILE" "$FORM_FILE" --output "$CONFIG_FILE" $NCL_TEMPLATE_ARG
|
||||
;;
|
||||
esac
|
||||
|
||||
EXIT_CODE=$?
|
||||
|
||||
if [[ $EXIT_CODE -eq 0 ]]; then
|
||||
echo ""
|
||||
echo "✅ Configuration saved to: $CONFIG_FILE"
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo " - Review the configuration: cat $CONFIG_FILE"
|
||||
echo " - Apply CI tools: (run your CI setup command)"
|
||||
echo " - Re-run this script anytime to update: $0"
|
||||
else
|
||||
echo ""
|
||||
echo "❌ Configuration cancelled or failed (exit code: $EXIT_CODE)"
|
||||
if [[ -f "${CONFIG_FILE}.bak" ]]; then
|
||||
echo " Previous config restored from backup"
|
||||
fi
|
||||
exit $EXIT_CODE
|
||||
fi
|
||||
27
.typedialog/ci/envrc
Normal file
@ -0,0 +1,27 @@
|
||||
# Auto-generated by dev-system/ci
|
||||
#
|
||||
# Cascading Path Strategy:
|
||||
# 1. Local files in .typedialog/ci/ take precedence (overrides)
|
||||
# 2. Central files in $TOOLS_PATH/dev-system/ci/ as fallback (defaults)
|
||||
#
|
||||
# To customize: Create file in .typedialog/ci/{schemas,validators,defaults,fragments}/
|
||||
# Your local version will be used instead of the Tools version.
|
||||
|
||||
# Nickel import paths (cascading: local → Tools)
|
||||
export NICKEL_IMPORT_PATH="schemas:$TOOLS_PATH/dev-system/ci/schemas:validators:$TOOLS_PATH/dev-system/ci/validators:defaults:$TOOLS_PATH/dev-system/ci/defaults"
|
||||
|
||||
# TypeDialog fragment search paths (cascading: local → Tools)
|
||||
export TYPEDIALOG_FRAGMENT_PATH=".typedialog/ci:$TOOLS_PATH/dev-system/ci/forms"
|
||||
|
||||
# Nickel template for config.ncl generation (with cascading)
|
||||
# Local template takes precedence if exists
|
||||
if [[ -f ".typedialog/ci/config.ncl.j2" ]]; then
|
||||
export NCL_TEMPLATE=".typedialog/ci/config.ncl.j2"
|
||||
else
|
||||
export NCL_TEMPLATE="$TOOLS_PATH/dev-system/ci/templates/config.ncl.j2"
|
||||
fi
|
||||
|
||||
# TypeDialog web backend configuration (override if needed)
|
||||
export TYPEDIALOG_PORT=${TYPEDIALOG_PORT:-9000}
|
||||
export TYPEDIALOG_HOST=${TYPEDIALOG_HOST:-localhost}
|
||||
export TYPEDIALOG_LANG=${TYPEDIALOG_LANG:-${LANG:-en_US.UTF-8}}
|
||||
175
.typedialog/ci/form.toml
Normal file
@ -0,0 +1,175 @@
|
||||
description = "Interactive configuration for continuous integration and code quality tools"
|
||||
display_mode = "complete"
|
||||
locales_path = ""
|
||||
name = "CI Configuration Form"
|
||||
|
||||
[[elements]]
|
||||
border_bottom = true
|
||||
border_top = true
|
||||
name = "project_header"
|
||||
title = "📦 Project Information"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
help = "Name of the project"
|
||||
name = "project_name"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"name",
|
||||
]
|
||||
placeholder = "my-project"
|
||||
prompt = "Project name"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
help = "Optional description"
|
||||
name = "project_description"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"description",
|
||||
]
|
||||
placeholder = "Brief description of what this project does"
|
||||
prompt = "Project description"
|
||||
required = false
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = ""
|
||||
help = "Project website or documentation site URL"
|
||||
name = "project_site_url"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"site_url",
|
||||
]
|
||||
placeholder = "https://example.com"
|
||||
prompt = "Project Site URL"
|
||||
required = false
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = ""
|
||||
help = "Project repository URL (GitHub, GitLab, etc.)"
|
||||
name = "project_repo_url"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"repo_url",
|
||||
]
|
||||
placeholder = "https://github.com/user/repo"
|
||||
prompt = "Project Repo URL"
|
||||
required = false
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
border_bottom = true
|
||||
border_top = true
|
||||
name = "languages_header"
|
||||
title = "🔍 Detected Languages"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "markdown"
|
||||
display_mode = "grid"
|
||||
help = "Select all languages detected or used in the project"
|
||||
min_selected = 1
|
||||
name = "detected_languages"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"detected_languages",
|
||||
]
|
||||
prompt = "Which languages are used in this project?"
|
||||
required = true
|
||||
searchable = true
|
||||
type = "multiselect"
|
||||
|
||||
[[elements.options]]
|
||||
value = "markdown"
|
||||
label = "📝 Markdown/Documentation"
|
||||
|
||||
[[elements]]
|
||||
help = "Main language used for defaults (e.g., in GitHub Actions workflows)"
|
||||
name = "primary_language"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"primary_language",
|
||||
]
|
||||
options_from = "detected_languages"
|
||||
prompt = "Primary language"
|
||||
required = true
|
||||
type = "select"
|
||||
default = "markdown"
|
||||
|
||||
[[elements.options]]
|
||||
value = "markdown"
|
||||
label = "📝 Markdown"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/markdown-tools.toml"]
|
||||
name = "markdown_tools_group"
|
||||
type = "group"
|
||||
when = "markdown in detected_languages"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/general-tools.toml"]
|
||||
name = "general_tools_group"
|
||||
type = "group"
|
||||
|
||||
[[elements]]
|
||||
border_bottom = true
|
||||
border_top = true
|
||||
name = "ci_cd_header"
|
||||
title = "🔄 CI/CD Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "true"
|
||||
help = "Set up continuous integration and deployment pipelines"
|
||||
name = "enable_ci_cd"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"features",
|
||||
"enable_ci_cd",
|
||||
]
|
||||
prompt = "Enable CI/CD integration?"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/ci-providers.toml"]
|
||||
name = "ci_providers_group"
|
||||
type = "group"
|
||||
when = "enable_ci_cd == true"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/ci-settings.toml"]
|
||||
name = "ci_settings_group"
|
||||
type = "group"
|
||||
when = "enable_ci_cd == true"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/build-deployment.toml"]
|
||||
name = "build_deployment_group"
|
||||
type = "group"
|
||||
when = "enable_ci_cd == true"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/documentation.toml"]
|
||||
name = "documentation_group"
|
||||
type = "group"
|
||||
|
||||
[[elements]]
|
||||
border_bottom = true
|
||||
border_top = true
|
||||
name = "confirmation_header"
|
||||
title = "✅ Ready to Install"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
content = "Review your configuration above. After confirming, the CI system will be installed with your chosen settings."
|
||||
name = "confirmation_footer"
|
||||
type = "footer"
|
||||
41
.vale.ini
Normal file
@ -0,0 +1,41 @@
|
||||
# Vale configuration for TypeDialog documentation
|
||||
# https://vale.sh/docs/topics/config/
|
||||
|
||||
StylesPath = .vale/styles
|
||||
MinAlertLevel = warning
|
||||
|
||||
# Global settings
|
||||
[*]
|
||||
Packages = Google, write-good
|
||||
Vocab = TypeDialog
|
||||
|
||||
# Markdown files: docs/**/*.md and root *.md (excluding .claude, .coder, CLAUDE.md)
|
||||
[*.md]
|
||||
BasedOnStyles = write-good, Google
|
||||
|
||||
# Ignore code blocks and specific patterns
|
||||
TokenIgnores = (\$\{[^\}]+\}), (`[^`]+`), (\*\*[^\*]+\*\*)
|
||||
|
||||
# Disable noisy rules for technical documentation
|
||||
Google.Headings = NO
|
||||
Google.Parens = NO
|
||||
Google.Acronyms = NO
|
||||
Google.Passive = NO
|
||||
Google.We = NO
|
||||
Google.Will = NO
|
||||
Google.WordList = NO
|
||||
Google.Colons = NO
|
||||
|
||||
write-good.E-Prime = NO
|
||||
write-good.TooWordy = NO
|
||||
write-good.Passive = NO
|
||||
|
||||
Vale.Spelling = NO
|
||||
|
||||
# Keep enabled (useful for technical docs):
|
||||
# - write-good.Weasel (vague words like "various")
|
||||
# - Google.Contractions (maintain formal tone)
|
||||
# - Google.FirstPerson (avoid "we/our")
|
||||
# - Google.Exclamation
|
||||
# - Google.Slang
|
||||
# - Google.Units
|
||||
25
.vale/Vocab/TypeDialog/accept.txt
Normal file
@ -0,0 +1,25 @@
|
||||
# TypeDialog accepted terms (case-insensitive)
|
||||
# Technical acronyms and abbreviations
|
||||
API
|
||||
CLI
|
||||
TUI
|
||||
JSON
|
||||
YAML
|
||||
TOML
|
||||
REST
|
||||
HTTP
|
||||
HTTPS
|
||||
TLS
|
||||
SSL
|
||||
CORS
|
||||
URL
|
||||
URI
|
||||
NPM
|
||||
SDK
|
||||
HTML
|
||||
CSS
|
||||
JWT
|
||||
WASM
|
||||
WebAssembly
|
||||
README
|
||||
CHANGELOG
|
||||
2
.vale/Vocab/TypeDialog/reject.txt
Normal file
@ -0,0 +1,2 @@
|
||||
# TypeDialog rejected terms
|
||||
# Add terms that should never be used
|
||||
9
.vale/styles/Google/AMPM.yml
Normal file
@ -0,0 +1,9 @@
|
||||
extends: existence
|
||||
message: "Use 'AM' or 'PM' (preceded by a space)."
|
||||
link: "https://developers.google.com/style/word-list"
|
||||
level: error
|
||||
nonword: true
|
||||
tokens:
|
||||
- '\d{1,2}[AP]M\b'
|
||||
- '\d{1,2} ?[ap]m\b'
|
||||
- '\d{1,2} ?[aApP]\.[mM]\.'
|
||||
64
.vale/styles/Google/Acronyms.yml
Normal file
@ -0,0 +1,64 @@
|
||||
extends: conditional
|
||||
message: "Spell out '%s', if it's unfamiliar to the audience."
|
||||
link: 'https://developers.google.com/style/abbreviations'
|
||||
level: suggestion
|
||||
ignorecase: false
|
||||
# Ensures that the existence of 'first' implies the existence of 'second'.
|
||||
first: '\b([A-Z]{3,5})\b'
|
||||
second: '(?:\b[A-Z][a-z]+ )+\(([A-Z]{3,5})\)'
|
||||
# ... with the exception of these:
|
||||
exceptions:
|
||||
- API
|
||||
- ASP
|
||||
- CLI
|
||||
- CPU
|
||||
- CSS
|
||||
- CSV
|
||||
- DEBUG
|
||||
- DOM
|
||||
- DPI
|
||||
- FAQ
|
||||
- GCC
|
||||
- GDB
|
||||
- GET
|
||||
- GPU
|
||||
- GTK
|
||||
- GUI
|
||||
- HTML
|
||||
- HTTP
|
||||
- HTTPS
|
||||
- IDE
|
||||
- JAR
|
||||
- JSON
|
||||
- JSX
|
||||
- LESS
|
||||
- LLDB
|
||||
- NET
|
||||
- NOTE
|
||||
- NVDA
|
||||
- OSS
|
||||
- PATH
|
||||
- PDF
|
||||
- PHP
|
||||
- POST
|
||||
- RAM
|
||||
- REPL
|
||||
- RSA
|
||||
- SCM
|
||||
- SCSS
|
||||
- SDK
|
||||
- SQL
|
||||
- SSH
|
||||
- SSL
|
||||
- SVG
|
||||
- TBD
|
||||
- TCP
|
||||
- TODO
|
||||
- URI
|
||||
- URL
|
||||
- USB
|
||||
- UTF
|
||||
- XML
|
||||
- XSS
|
||||
- YAML
|
||||
- ZIP
|
||||
8
.vale/styles/Google/Colons.yml
Normal file
@ -0,0 +1,8 @@
|
||||
extends: existence
|
||||
message: "'%s' should be in lowercase."
|
||||
link: 'https://developers.google.com/style/colons'
|
||||
nonword: true
|
||||
level: warning
|
||||
scope: sentence
|
||||
tokens:
|
||||
- '(?<!:[^ ]+?):\s[A-Z]'
|
||||
30
.vale/styles/Google/Contractions.yml
Normal file
@ -0,0 +1,30 @@
|
||||
extends: substitution
|
||||
message: "Use '%s' instead of '%s'."
|
||||
link: 'https://developers.google.com/style/contractions'
|
||||
level: suggestion
|
||||
ignorecase: true
|
||||
action:
|
||||
name: replace
|
||||
swap:
|
||||
are not: aren't
|
||||
cannot: can't
|
||||
could not: couldn't
|
||||
did not: didn't
|
||||
do not: don't
|
||||
does not: doesn't
|
||||
has not: hasn't
|
||||
have not: haven't
|
||||
how is: how's
|
||||
is not: isn't
|
||||
it is: it's
|
||||
should not: shouldn't
|
||||
that is: that's
|
||||
they are: they're
|
||||
was not: wasn't
|
||||
we are: we're
|
||||
we have: we've
|
||||
were not: weren't
|
||||
what is: what's
|
||||
when is: when's
|
||||
where is: where's
|
||||
will not: won't
|
||||
9
.vale/styles/Google/DateFormat.yml
Normal file
@ -0,0 +1,9 @@
|
||||
extends: existence
|
||||
message: "Use 'July 31, 2016' format, not '%s'."
|
||||
link: 'https://developers.google.com/style/dates-times'
|
||||
ignorecase: true
|
||||
level: error
|
||||
nonword: true
|
||||
tokens:
|
||||
- '\d{1,2}(?:\.|/)\d{1,2}(?:\.|/)\d{4}'
|
||||
- '\d{1,2} (?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)|May|Jun(?:e)|Jul(?:y)|Aug(?:ust)|Sep(?:tember)?|Oct(?:ober)|Nov(?:ember)?|Dec(?:ember)?) \d{4}'
|
||||
9
.vale/styles/Google/Ellipses.yml
Normal file
@ -0,0 +1,9 @@
|
||||
extends: existence
|
||||
message: "In general, don't use an ellipsis."
|
||||
link: 'https://developers.google.com/style/ellipses'
|
||||
nonword: true
|
||||
level: warning
|
||||
action:
|
||||
name: remove
|
||||
tokens:
|
||||
- '\.\.\.'
|
||||
12
.vale/styles/Google/EmDash.yml
Normal file
@ -0,0 +1,12 @@
|
||||
extends: existence
|
||||
message: "Don't put a space before or after a dash."
|
||||
link: "https://developers.google.com/style/dashes"
|
||||
nonword: true
|
||||
level: error
|
||||
action:
|
||||
name: edit
|
||||
params:
|
||||
- trim
|
||||
- " "
|
||||
tokens:
|
||||
- '\s[—–]\s'
|
||||
12
.vale/styles/Google/Exclamation.yml
Normal file
@ -0,0 +1,12 @@
|
||||
extends: existence
|
||||
message: "Don't use exclamation points in text."
|
||||
link: "https://developers.google.com/style/exclamation-points"
|
||||
nonword: true
|
||||
level: error
|
||||
action:
|
||||
name: edit
|
||||
params:
|
||||
- trim_right
|
||||
- "!"
|
||||
tokens:
|
||||
- '\w+!(?:\s|$)'
|
||||
13
.vale/styles/Google/FirstPerson.yml
Normal file
@ -0,0 +1,13 @@
|
||||
extends: existence
|
||||
message: "Avoid first-person pronouns such as '%s'."
|
||||
link: 'https://developers.google.com/style/pronouns#personal-pronouns'
|
||||
ignorecase: true
|
||||
level: warning
|
||||
nonword: true
|
||||
tokens:
|
||||
- (?:^|\s)I\s
|
||||
- (?:^|\s)I,\s
|
||||
- \bI'm\b
|
||||
- \bme\b
|
||||
- \bmy\b
|
||||
- \bmine\b
|
||||
9
.vale/styles/Google/Gender.yml
Normal file
@ -0,0 +1,9 @@
|
||||
extends: existence
|
||||
message: "Don't use '%s' as a gender-neutral pronoun."
|
||||
link: 'https://developers.google.com/style/pronouns#gender-neutral-pronouns'
|
||||
level: error
|
||||
ignorecase: true
|
||||
tokens:
|
||||
- he/she
|
||||
- s/he
|
||||
- \(s\)he
|
||||
43
.vale/styles/Google/GenderBias.yml
Normal file
@ -0,0 +1,43 @@
|
||||
extends: substitution
|
||||
message: "Consider using '%s' instead of '%s'."
|
||||
ignorecase: true
|
||||
link: "https://developers.google.com/style/inclusive-documentation"
|
||||
level: error
|
||||
action:
|
||||
name: replace
|
||||
swap:
|
||||
(?:alumna|alumnus): graduate
|
||||
(?:alumnae|alumni): graduates
|
||||
air(?:m[ae]n|wom[ae]n): pilot(s)
|
||||
anchor(?:m[ae]n|wom[ae]n): anchor(s)
|
||||
authoress: author
|
||||
camera(?:m[ae]n|wom[ae]n): camera operator(s)
|
||||
door(?:m[ae]|wom[ae]n): concierge(s)
|
||||
draft(?:m[ae]n|wom[ae]n): drafter(s)
|
||||
fire(?:m[ae]n|wom[ae]n): firefighter(s)
|
||||
fisher(?:m[ae]n|wom[ae]n): fisher(s)
|
||||
fresh(?:m[ae]n|wom[ae]n): first-year student(s)
|
||||
garbage(?:m[ae]n|wom[ae]n): waste collector(s)
|
||||
lady lawyer: lawyer
|
||||
ladylike: courteous
|
||||
mail(?:m[ae]n|wom[ae]n): mail carriers
|
||||
man and wife: husband and wife
|
||||
man enough: strong enough
|
||||
mankind: human kind|humanity
|
||||
manmade: manufactured
|
||||
manpower: personnel
|
||||
middle(?:m[ae]n|wom[ae]n): intermediary
|
||||
news(?:m[ae]n|wom[ae]n): journalist(s)
|
||||
ombuds(?:man|woman): ombuds
|
||||
oneupmanship: upstaging
|
||||
poetess: poet
|
||||
police(?:m[ae]n|wom[ae]n): police officer(s)
|
||||
repair(?:m[ae]n|wom[ae]n): technician(s)
|
||||
sales(?:m[ae]n|wom[ae]n): salesperson or sales people
|
||||
service(?:m[ae]n|wom[ae]n): soldier(s)
|
||||
steward(?:ess)?: flight attendant
|
||||
tribes(?:m[ae]n|wom[ae]n): tribe member(s)
|
||||
waitress: waiter
|
||||
woman doctor: doctor
|
||||
woman scientist[s]?: scientist(s)
|
||||
work(?:m[ae]n|wom[ae]n): worker(s)
|
||||
13
.vale/styles/Google/HeadingPunctuation.yml
Normal file
@ -0,0 +1,13 @@
|
||||
extends: existence
|
||||
message: "Don't put a period at the end of a heading."
|
||||
link: "https://developers.google.com/style/capitalization#capitalization-in-titles-and-headings"
|
||||
nonword: true
|
||||
level: warning
|
||||
scope: heading
|
||||
action:
|
||||
name: edit
|
||||
params:
|
||||
- trim_right
|
||||
- "."
|
||||
tokens:
|
||||
- '[a-z0-9][.]\s*$'
|
||||
29
.vale/styles/Google/Headings.yml
Normal file
@ -0,0 +1,29 @@
|
||||
extends: capitalization
|
||||
message: "'%s' should use sentence-style capitalization."
|
||||
link: "https://developers.google.com/style/capitalization#capitalization-in-titles-and-headings"
|
||||
level: warning
|
||||
scope: heading
|
||||
match: $sentence
|
||||
indicators:
|
||||
- ":"
|
||||
exceptions:
|
||||
- Azure
|
||||
- CLI
|
||||
- Cosmos
|
||||
- Docker
|
||||
- Emmet
|
||||
- gRPC
|
||||
- I
|
||||
- Kubernetes
|
||||
- Linux
|
||||
- macOS
|
||||
- Marketplace
|
||||
- MongoDB
|
||||
- REPL
|
||||
- Studio
|
||||
- TypeScript
|
||||
- URLs
|
||||
- Visual
|
||||
- VS
|
||||
- Windows
|
||||
- JSON
|
||||
11
.vale/styles/Google/Latin.yml
Normal file
@ -0,0 +1,11 @@
|
||||
extends: substitution
|
||||
message: "Use '%s' instead of '%s'."
|
||||
link: 'https://developers.google.com/style/abbreviations'
|
||||
ignorecase: true
|
||||
level: error
|
||||
nonword: true
|
||||
action:
|
||||
name: replace
|
||||
swap:
|
||||
'\b(?:eg|e\.g\.)(?=[\s,;])': for example
|
||||
'\b(?:ie|i\.e\.)(?=[\s,;])': that is
|
||||
14
.vale/styles/Google/LyHyphens.yml
Normal file
@ -0,0 +1,14 @@
|
||||
extends: existence
|
||||
message: "'%s' doesn't need a hyphen."
|
||||
link: "https://developers.google.com/style/hyphens"
|
||||
level: error
|
||||
ignorecase: false
|
||||
nonword: true
|
||||
action:
|
||||
name: edit
|
||||
params:
|
||||
- regex
|
||||
- "-"
|
||||
- " "
|
||||
tokens:
|
||||
- '\b[^\s-]+ly-\w+\b'
|
||||
12
.vale/styles/Google/OptionalPlurals.yml
Normal file
@ -0,0 +1,12 @@
|
||||
extends: existence
|
||||
message: "Don't use plurals in parentheses such as in '%s'."
|
||||
link: "https://developers.google.com/style/plurals-parentheses"
|
||||
level: error
|
||||
nonword: true
|
||||
action:
|
||||
name: edit
|
||||
params:
|
||||
- trim_right
|
||||
- "(s)"
|
||||
tokens:
|
||||
- '\b\w+\(s\)'
|
||||
7
.vale/styles/Google/Ordinal.yml
Normal file
@ -0,0 +1,7 @@
|
||||
extends: existence
|
||||
message: "Spell out all ordinal numbers ('%s') in text."
|
||||
link: 'https://developers.google.com/style/numbers'
|
||||
level: error
|
||||
nonword: true
|
||||
tokens:
|
||||
- \d+(?:st|nd|rd|th)
|
||||
7
.vale/styles/Google/OxfordComma.yml
Normal file
@ -0,0 +1,7 @@
|
||||
extends: existence
|
||||
message: "Use the Oxford comma in '%s'."
|
||||
link: 'https://developers.google.com/style/commas'
|
||||
scope: sentence
|
||||
level: warning
|
||||
tokens:
|
||||
- '(?:[^,]+,){1,}\s\w+\s(?:and|or)'
|
||||
7
.vale/styles/Google/Parens.yml
Normal file
@ -0,0 +1,7 @@
|
||||
extends: existence
|
||||
message: "Use parentheses judiciously."
|
||||
link: 'https://developers.google.com/style/parentheses'
|
||||
nonword: true
|
||||
level: suggestion
|
||||
tokens:
|
||||
- '\(.+\)'
|
||||
184
.vale/styles/Google/Passive.yml
Normal file
@ -0,0 +1,184 @@
|
||||
extends: existence
|
||||
link: 'https://developers.google.com/style/voice'
|
||||
message: "In general, use active voice instead of passive voice ('%s')."
|
||||
ignorecase: true
|
||||
level: suggestion
|
||||
raw:
|
||||
- \b(am|are|were|being|is|been|was|be)\b\s*
|
||||
tokens:
|
||||
- '[\w]+ed'
|
||||
- awoken
|
||||
- beat
|
||||
- become
|
||||
- been
|
||||
- begun
|
||||
- bent
|
||||
- beset
|
||||
- bet
|
||||
- bid
|
||||
- bidden
|
||||
- bitten
|
||||
- bled
|
||||
- blown
|
||||
- born
|
||||
- bought
|
||||
- bound
|
||||
- bred
|
||||
- broadcast
|
||||
- broken
|
||||
- brought
|
||||
- built
|
||||
- burnt
|
||||
- burst
|
||||
- cast
|
||||
- caught
|
||||
- chosen
|
||||
- clung
|
||||
- come
|
||||
- cost
|
||||
- crept
|
||||
- cut
|
||||
- dealt
|
||||
- dived
|
||||
- done
|
||||
- drawn
|
||||
- dreamt
|
||||
- driven
|
||||
- drunk
|
||||
- dug
|
||||
- eaten
|
||||
- fallen
|
||||
- fed
|
||||
- felt
|
||||
- fit
|
||||
- fled
|
||||
- flown
|
||||
- flung
|
||||
- forbidden
|
||||
- foregone
|
||||
- forgiven
|
||||
- forgotten
|
||||
- forsaken
|
||||
- fought
|
||||
- found
|
||||
- frozen
|
||||
- given
|
||||
- gone
|
||||
- gotten
|
||||
- ground
|
||||
- grown
|
||||
- heard
|
||||
- held
|
||||
- hidden
|
||||
- hit
|
||||
- hung
|
||||
- hurt
|
||||
- kept
|
||||
- knelt
|
||||
- knit
|
||||
- known
|
||||
- laid
|
||||
- lain
|
||||
- leapt
|
||||
- learnt
|
||||
- led
|
||||
- left
|
||||
- lent
|
||||
- let
|
||||
- lighted
|
||||
- lost
|
||||
- made
|
||||
- meant
|
||||
- met
|
||||
- misspelt
|
||||
- mistaken
|
||||
- mown
|
||||
- overcome
|
||||
- overdone
|
||||
- overtaken
|
||||
- overthrown
|
||||
- paid
|
||||
- pled
|
||||
- proven
|
||||
- put
|
||||
- quit
|
||||
- read
|
||||
- rid
|
||||
- ridden
|
||||
- risen
|
||||
- run
|
||||
- rung
|
||||
- said
|
||||
- sat
|
||||
- sawn
|
||||
- seen
|
||||
- sent
|
||||
- set
|
||||
- sewn
|
||||
- shaken
|
||||
- shaven
|
||||
- shed
|
||||
- shod
|
||||
- shone
|
||||
- shorn
|
||||
- shot
|
||||
- shown
|
||||
- shrunk
|
||||
- shut
|
||||
- slain
|
||||
- slept
|
||||
- slid
|
||||
- slit
|
||||
- slung
|
||||
- smitten
|
||||
- sold
|
||||
- sought
|
||||
- sown
|
||||
- sped
|
||||
- spent
|
||||
- spilt
|
||||
- spit
|
||||
- split
|
||||
- spoken
|
||||
- spread
|
||||
- sprung
|
||||
- spun
|
||||
- stolen
|
||||
- stood
|
||||
- stridden
|
||||
- striven
|
||||
- struck
|
||||
- strung
|
||||
- stuck
|
||||
- stung
|
||||
- stunk
|
||||
- sung
|
||||
- sunk
|
||||
- swept
|
||||
- swollen
|
||||
- sworn
|
||||
- swum
|
||||
- swung
|
||||
- taken
|
||||
- taught
|
||||
- thought
|
||||
- thrived
|
||||
- thrown
|
||||
- thrust
|
||||
- told
|
||||
- torn
|
||||
- trodden
|
||||
- understood
|
||||
- upheld
|
||||
- upset
|
||||
- wed
|
||||
- wept
|
||||
- withheld
|
||||
- withstood
|
||||
- woken
|
||||
- won
|
||||
- worn
|
||||
- wound
|
||||
- woven
|
||||
- written
|
||||
- wrung
|
||||
7
.vale/styles/Google/Periods.yml
Normal file
@ -0,0 +1,7 @@
|
||||
extends: existence
|
||||
message: "Don't use periods with acronyms or initialisms such as '%s'."
|
||||
link: 'https://developers.google.com/style/abbreviations'
|
||||
level: error
|
||||
nonword: true
|
||||
tokens:
|
||||
- '\b(?:[A-Z]\.){3,}'
|
||||
7
.vale/styles/Google/Quotes.yml
Normal file
@ -0,0 +1,7 @@
|
||||
extends: existence
|
||||
message: "Commas and periods go inside quotation marks."
|
||||
link: 'https://developers.google.com/style/quotation-marks'
|
||||
level: error
|
||||
nonword: true
|
||||
tokens:
|
||||
- '"[^"]+"[.,?]'
|
||||
7
.vale/styles/Google/Ranges.yml
Normal file
@ -0,0 +1,7 @@
|
||||
extends: existence
|
||||
message: "Don't add words such as 'from' or 'between' to describe a range of numbers."
|
||||
link: 'https://developers.google.com/style/hyphens'
|
||||
nonword: true
|
||||
level: warning
|
||||
tokens:
|
||||
- '(?:from|between)\s\d+\s?-\s?\d+'
|
||||
8
.vale/styles/Google/Semicolons.yml
Normal file
@ -0,0 +1,8 @@
|
||||
extends: existence
|
||||
message: "Use semicolons judiciously."
|
||||
link: 'https://developers.google.com/style/semicolons'
|
||||
nonword: true
|
||||
scope: sentence
|
||||
level: suggestion
|
||||
tokens:
|
||||
- ';'
|
||||
11
.vale/styles/Google/Slang.yml
Normal file
@ -0,0 +1,11 @@
|
||||
extends: existence
|
||||
message: "Don't use internet slang abbreviations such as '%s'."
|
||||
link: 'https://developers.google.com/style/abbreviations'
|
||||
ignorecase: true
|
||||
level: error
|
||||
tokens:
|
||||
- 'tl;dr'
|
||||
- ymmv
|
||||
- rtfm
|
||||
- imo
|
||||
- fwiw
|
||||
10
.vale/styles/Google/Spacing.yml
Normal file
@ -0,0 +1,10 @@
|
||||
extends: existence
|
||||
message: "'%s' should have one space."
|
||||
link: 'https://developers.google.com/style/sentence-spacing'
|
||||
level: error
|
||||
nonword: true
|
||||
action:
|
||||
name: remove
|
||||
tokens:
|
||||
- '[a-z][.?!] {2,}[A-Z]'
|
||||
- '[a-z][.?!][A-Z]'
|
||||
10
.vale/styles/Google/Spelling.yml
Normal file
@ -0,0 +1,10 @@
|
||||
extends: existence
|
||||
message: "In general, use American spelling instead of '%s'."
|
||||
link: 'https://developers.google.com/style/spelling'
|
||||
ignorecase: true
|
||||
level: warning
|
||||
tokens:
|
||||
- '(?:\w+)nised?'
|
||||
- 'colour'
|
||||
- 'labour'
|
||||
- 'centre'
|
||||
8
.vale/styles/Google/Units.yml
Normal file
@ -0,0 +1,8 @@
|
||||
extends: existence
|
||||
message: "Put a nonbreaking space between the number and the unit in '%s'."
|
||||
link: "https://developers.google.com/style/units-of-measure"
|
||||
nonword: true
|
||||
level: error
|
||||
tokens:
|
||||
- \b\d+(?:B|kB|MB|GB|TB)
|
||||
- \b\d+(?:ns|ms|s|min|h|d)
|
||||
11
.vale/styles/Google/We.yml
Normal file
@ -0,0 +1,11 @@
|
||||
extends: existence
|
||||
message: "Try to avoid using first-person plural like '%s'."
|
||||
link: 'https://developers.google.com/style/pronouns#personal-pronouns'
|
||||
level: warning
|
||||
ignorecase: true
|
||||
tokens:
|
||||
- we
|
||||
- we'(?:ve|re)
|
||||
- ours?
|
||||
- us
|
||||
- let's
|
||||
7
.vale/styles/Google/Will.yml
Normal file
@ -0,0 +1,7 @@
|
||||
extends: existence
|
||||
message: "Avoid using '%s'."
|
||||
link: 'https://developers.google.com/style/tense'
|
||||
ignorecase: true
|
||||
level: warning
|
||||
tokens:
|
||||
- will
|
||||
80
.vale/styles/Google/WordList.yml
Normal file
@ -0,0 +1,80 @@
|
||||
extends: substitution
|
||||
message: "Use '%s' instead of '%s'."
|
||||
link: "https://developers.google.com/style/word-list"
|
||||
level: warning
|
||||
ignorecase: false
|
||||
action:
|
||||
name: replace
|
||||
swap:
|
||||
"(?:API Console|dev|developer) key": API key
|
||||
"(?:cell ?phone|smart ?phone)": phone|mobile phone
|
||||
"(?:dev|developer|APIs) console": API console
|
||||
"(?:e-mail|Email|E-mail)": email
|
||||
"(?:file ?path|path ?name)": path
|
||||
"(?:kill|terminate|abort)": stop|exit|cancel|end
|
||||
"(?:OAuth ?2|Oauth)": OAuth 2.0
|
||||
"(?:ok|Okay)": OK|okay
|
||||
"(?:WiFi|wifi)": Wi-Fi
|
||||
'[\.]+apk': APK
|
||||
'3\-D': 3D
|
||||
'Google (?:I\-O|IO)': Google I/O
|
||||
"tap (?:&|and) hold": touch & hold
|
||||
"un(?:check|select)": clear
|
||||
above: preceding
|
||||
account name: username
|
||||
action bar: app bar
|
||||
admin: administrator
|
||||
Ajax: AJAX
|
||||
a\.k\.a|aka: or|also known as
|
||||
Android device: Android-powered device
|
||||
android: Android
|
||||
API explorer: APIs Explorer
|
||||
application: app
|
||||
approx\.: approximately
|
||||
authN: authentication
|
||||
authZ: authorization
|
||||
autoupdate: automatically update
|
||||
cellular data: mobile data
|
||||
cellular network: mobile network
|
||||
chapter: documents|pages|sections
|
||||
check box: checkbox
|
||||
CLI: command-line tool
|
||||
click on: click|click in
|
||||
Cloud: Google Cloud Platform|GCP
|
||||
Container Engine: Kubernetes Engine
|
||||
content type: media type
|
||||
curated roles: predefined roles
|
||||
data are: data is
|
||||
Developers Console: Google API Console|API Console
|
||||
disabled?: turn off|off
|
||||
ephemeral IP address: ephemeral external IP address
|
||||
fewer data: less data
|
||||
file name: filename
|
||||
firewalls: firewall rules
|
||||
functionality: capability|feature
|
||||
Google account: Google Account
|
||||
Google accounts: Google Accounts
|
||||
Googling: search with Google
|
||||
grayed-out: unavailable
|
||||
HTTPs: HTTPS
|
||||
in order to: to
|
||||
ingest: import|load
|
||||
k8s: Kubernetes
|
||||
long press: touch & hold
|
||||
network IP address: internal IP address
|
||||
omnibox: address bar
|
||||
open-source: open source
|
||||
overview screen: recents screen
|
||||
regex: regular expression
|
||||
SHA1: SHA-1|HAS-SHA1
|
||||
sign into: sign in to
|
||||
sign-?on: single sign-on
|
||||
static IP address: static external IP address
|
||||
stylesheet: style sheet
|
||||
synch: sync
|
||||
tablename: table name
|
||||
tablet: device
|
||||
touch: tap
|
||||
url: URL
|
||||
vs\.: versus
|
||||
World Wide Web: web
|
||||
4
.vale/styles/Google/meta.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"feed": "https://github.com/errata-ai/Google/releases.atom",
|
||||
"vale_version": ">=1.0.0"
|
||||
}
|
||||
0
.vale/styles/Google/vocab.txt
Normal file
702
.vale/styles/write-good/Cliches.yml
Normal file
@ -0,0 +1,702 @@
|
||||
extends: existence
|
||||
message: "Try to avoid using clichés like '%s'."
|
||||
ignorecase: true
|
||||
level: warning
|
||||
tokens:
|
||||
- a chip off the old block
|
||||
- a clean slate
|
||||
- a dark and stormy night
|
||||
- a far cry
|
||||
- a fine kettle of fish
|
||||
- a loose cannon
|
||||
- a penny saved is a penny earned
|
||||
- a tough row to hoe
|
||||
- a word to the wise
|
||||
- ace in the hole
|
||||
- acid test
|
||||
- add insult to injury
|
||||
- against all odds
|
||||
- air your dirty laundry
|
||||
- all fun and games
|
||||
- all in a day's work
|
||||
- all talk, no action
|
||||
- all thumbs
|
||||
- all your eggs in one basket
|
||||
- all's fair in love and war
|
||||
- all's well that ends well
|
||||
- almighty dollar
|
||||
- American as apple pie
|
||||
- an axe to grind
|
||||
- another day, another dollar
|
||||
- armed to the teeth
|
||||
- as luck would have it
|
||||
- as old as time
|
||||
- as the crow flies
|
||||
- at loose ends
|
||||
- at my wits end
|
||||
- avoid like the plague
|
||||
- babe in the woods
|
||||
- back against the wall
|
||||
- back in the saddle
|
||||
- back to square one
|
||||
- back to the drawing board
|
||||
- bad to the bone
|
||||
- badge of honor
|
||||
- bald faced liar
|
||||
- ballpark figure
|
||||
- banging your head against a brick wall
|
||||
- baptism by fire
|
||||
- barking up the wrong tree
|
||||
- bat out of hell
|
||||
- be all and end all
|
||||
- beat a dead horse
|
||||
- beat around the bush
|
||||
- been there, done that
|
||||
- beggars can't be choosers
|
||||
- behind the eight ball
|
||||
- bend over backwards
|
||||
- benefit of the doubt
|
||||
- bent out of shape
|
||||
- best thing since sliced bread
|
||||
- bet your bottom dollar
|
||||
- better half
|
||||
- better late than never
|
||||
- better mousetrap
|
||||
- better safe than sorry
|
||||
- between a rock and a hard place
|
||||
- beyond the pale
|
||||
- bide your time
|
||||
- big as life
|
||||
- big cheese
|
||||
- big fish in a small pond
|
||||
- big man on campus
|
||||
- bigger they are the harder they fall
|
||||
- bird in the hand
|
||||
- bird's eye view
|
||||
- birds and the bees
|
||||
- birds of a feather flock together
|
||||
- bit the hand that feeds you
|
||||
- bite the bullet
|
||||
- bite the dust
|
||||
- bitten off more than he can chew
|
||||
- black as coal
|
||||
- black as pitch
|
||||
- black as the ace of spades
|
||||
- blast from the past
|
||||
- bleeding heart
|
||||
- blessing in disguise
|
||||
- blind ambition
|
||||
- blind as a bat
|
||||
- blind leading the blind
|
||||
- blood is thicker than water
|
||||
- blood sweat and tears
|
||||
- blow off steam
|
||||
- blow your own horn
|
||||
- blushing bride
|
||||
- boils down to
|
||||
- bolt from the blue
|
||||
- bone to pick
|
||||
- bored stiff
|
||||
- bored to tears
|
||||
- bottomless pit
|
||||
- boys will be boys
|
||||
- bright and early
|
||||
- brings home the bacon
|
||||
- broad across the beam
|
||||
- broken record
|
||||
- brought back to reality
|
||||
- bull by the horns
|
||||
- bull in a china shop
|
||||
- burn the midnight oil
|
||||
- burning question
|
||||
- burning the candle at both ends
|
||||
- burst your bubble
|
||||
- bury the hatchet
|
||||
- busy as a bee
|
||||
- by hook or by crook
|
||||
- call a spade a spade
|
||||
- called onto the carpet
|
||||
- calm before the storm
|
||||
- can of worms
|
||||
- can't cut the mustard
|
||||
- can't hold a candle to
|
||||
- case of mistaken identity
|
||||
- cat got your tongue
|
||||
- cat's meow
|
||||
- caught in the crossfire
|
||||
- caught red-handed
|
||||
- checkered past
|
||||
- chomping at the bit
|
||||
- cleanliness is next to godliness
|
||||
- clear as a bell
|
||||
- clear as mud
|
||||
- close to the vest
|
||||
- cock and bull story
|
||||
- cold shoulder
|
||||
- come hell or high water
|
||||
- cool as a cucumber
|
||||
- cool, calm, and collected
|
||||
- cost a king's ransom
|
||||
- count your blessings
|
||||
- crack of dawn
|
||||
- crash course
|
||||
- creature comforts
|
||||
- cross that bridge when you come to it
|
||||
- crushing blow
|
||||
- cry like a baby
|
||||
- cry me a river
|
||||
- cry over spilt milk
|
||||
- crystal clear
|
||||
- curiosity killed the cat
|
||||
- cut and dried
|
||||
- cut through the red tape
|
||||
- cut to the chase
|
||||
- cute as a bugs ear
|
||||
- cute as a button
|
||||
- cute as a puppy
|
||||
- cuts to the quick
|
||||
- dark before the dawn
|
||||
- day in, day out
|
||||
- dead as a doornail
|
||||
- devil is in the details
|
||||
- dime a dozen
|
||||
- divide and conquer
|
||||
- dog and pony show
|
||||
- dog days
|
||||
- dog eat dog
|
||||
- dog tired
|
||||
- don't burn your bridges
|
||||
- don't count your chickens
|
||||
- don't look a gift horse in the mouth
|
||||
- don't rock the boat
|
||||
- don't step on anyone's toes
|
||||
- don't take any wooden nickels
|
||||
- down and out
|
||||
- down at the heels
|
||||
- down in the dumps
|
||||
- down the hatch
|
||||
- down to earth
|
||||
- draw the line
|
||||
- dressed to kill
|
||||
- dressed to the nines
|
||||
- drives me up the wall
|
||||
- dull as dishwater
|
||||
- dyed in the wool
|
||||
- eagle eye
|
||||
- ear to the ground
|
||||
- early bird catches the worm
|
||||
- easier said than done
|
||||
- easy as pie
|
||||
- eat your heart out
|
||||
- eat your words
|
||||
- eleventh hour
|
||||
- even the playing field
|
||||
- every dog has its day
|
||||
- every fiber of my being
|
||||
- everything but the kitchen sink
|
||||
- eye for an eye
|
||||
- face the music
|
||||
- facts of life
|
||||
- fair weather friend
|
||||
- fall by the wayside
|
||||
- fan the flames
|
||||
- feast or famine
|
||||
- feather your nest
|
||||
- feathered friends
|
||||
- few and far between
|
||||
- fifteen minutes of fame
|
||||
- filthy vermin
|
||||
- fine kettle of fish
|
||||
- fish out of water
|
||||
- fishing for a compliment
|
||||
- fit as a fiddle
|
||||
- fit the bill
|
||||
- fit to be tied
|
||||
- flash in the pan
|
||||
- flat as a pancake
|
||||
- flip your lid
|
||||
- flog a dead horse
|
||||
- fly by night
|
||||
- fly the coop
|
||||
- follow your heart
|
||||
- for all intents and purposes
|
||||
- for the birds
|
||||
- for what it's worth
|
||||
- force of nature
|
||||
- force to be reckoned with
|
||||
- forgive and forget
|
||||
- fox in the henhouse
|
||||
- free and easy
|
||||
- free as a bird
|
||||
- fresh as a daisy
|
||||
- full steam ahead
|
||||
- fun in the sun
|
||||
- garbage in, garbage out
|
||||
- gentle as a lamb
|
||||
- get a kick out of
|
||||
- get a leg up
|
||||
- get down and dirty
|
||||
- get the lead out
|
||||
- get to the bottom of
|
||||
- get your feet wet
|
||||
- gets my goat
|
||||
- gilding the lily
|
||||
- give and take
|
||||
- go against the grain
|
||||
- go at it tooth and nail
|
||||
- go for broke
|
||||
- go him one better
|
||||
- go the extra mile
|
||||
- go with the flow
|
||||
- goes without saying
|
||||
- good as gold
|
||||
- good deed for the day
|
||||
- good things come to those who wait
|
||||
- good time was had by all
|
||||
- good times were had by all
|
||||
- greased lightning
|
||||
- greek to me
|
||||
- green thumb
|
||||
- green-eyed monster
|
||||
- grist for the mill
|
||||
- growing like a weed
|
||||
- hair of the dog
|
||||
- hand to mouth
|
||||
- happy as a clam
|
||||
- happy as a lark
|
||||
- hasn't a clue
|
||||
- have a nice day
|
||||
- have high hopes
|
||||
- have the last laugh
|
||||
- haven't got a row to hoe
|
||||
- head honcho
|
||||
- head over heels
|
||||
- hear a pin drop
|
||||
- heard it through the grapevine
|
||||
- heart's content
|
||||
- heavy as lead
|
||||
- hem and haw
|
||||
- high and dry
|
||||
- high and mighty
|
||||
- high as a kite
|
||||
- hit paydirt
|
||||
- hold your head up high
|
||||
- hold your horses
|
||||
- hold your own
|
||||
- hold your tongue
|
||||
- honest as the day is long
|
||||
- horns of a dilemma
|
||||
- horse of a different color
|
||||
- hot under the collar
|
||||
- hour of need
|
||||
- I beg to differ
|
||||
- icing on the cake
|
||||
- if the shoe fits
|
||||
- if the shoe were on the other foot
|
||||
- in a jam
|
||||
- in a jiffy
|
||||
- in a nutshell
|
||||
- in a pig's eye
|
||||
- in a pinch
|
||||
- in a word
|
||||
- in hot water
|
||||
- in the gutter
|
||||
- in the nick of time
|
||||
- in the thick of it
|
||||
- in your dreams
|
||||
- it ain't over till the fat lady sings
|
||||
- it goes without saying
|
||||
- it takes all kinds
|
||||
- it takes one to know one
|
||||
- it's a small world
|
||||
- it's only a matter of time
|
||||
- ivory tower
|
||||
- Jack of all trades
|
||||
- jockey for position
|
||||
- jog your memory
|
||||
- joined at the hip
|
||||
- judge a book by its cover
|
||||
- jump down your throat
|
||||
- jump in with both feet
|
||||
- jump on the bandwagon
|
||||
- jump the gun
|
||||
- jump to conclusions
|
||||
- just a hop, skip, and a jump
|
||||
- just the ticket
|
||||
- justice is blind
|
||||
- keep a stiff upper lip
|
||||
- keep an eye on
|
||||
- keep it simple, stupid
|
||||
- keep the home fires burning
|
||||
- keep up with the Joneses
|
||||
- keep your chin up
|
||||
- keep your fingers crossed
|
||||
- kick the bucket
|
||||
- kick up your heels
|
||||
- kick your feet up
|
||||
- kid in a candy store
|
||||
- kill two birds with one stone
|
||||
- kiss of death
|
||||
- knock it out of the park
|
||||
- knock on wood
|
||||
- knock your socks off
|
||||
- know him from Adam
|
||||
- know the ropes
|
||||
- know the score
|
||||
- knuckle down
|
||||
- knuckle sandwich
|
||||
- knuckle under
|
||||
- labor of love
|
||||
- ladder of success
|
||||
- land on your feet
|
||||
- lap of luxury
|
||||
- last but not least
|
||||
- last hurrah
|
||||
- last-ditch effort
|
||||
- law of the jungle
|
||||
- law of the land
|
||||
- lay down the law
|
||||
- leaps and bounds
|
||||
- let sleeping dogs lie
|
||||
- let the cat out of the bag
|
||||
- let the good times roll
|
||||
- let your hair down
|
||||
- let's talk turkey
|
||||
- letter perfect
|
||||
- lick your wounds
|
||||
- lies like a rug
|
||||
- life's a bitch
|
||||
- life's a grind
|
||||
- light at the end of the tunnel
|
||||
- lighter than a feather
|
||||
- lighter than air
|
||||
- like clockwork
|
||||
- like father like son
|
||||
- like taking candy from a baby
|
||||
- like there's no tomorrow
|
||||
- lion's share
|
||||
- live and learn
|
||||
- live and let live
|
||||
- long and short of it
|
||||
- long lost love
|
||||
- look before you leap
|
||||
- look down your nose
|
||||
- look what the cat dragged in
|
||||
- looking a gift horse in the mouth
|
||||
- looks like death warmed over
|
||||
- loose cannon
|
||||
- lose your head
|
||||
- lose your temper
|
||||
- loud as a horn
|
||||
- lounge lizard
|
||||
- loved and lost
|
||||
- low man on the totem pole
|
||||
- luck of the draw
|
||||
- luck of the Irish
|
||||
- make hay while the sun shines
|
||||
- make money hand over fist
|
||||
- make my day
|
||||
- make the best of a bad situation
|
||||
- make the best of it
|
||||
- make your blood boil
|
||||
- man of few words
|
||||
- man's best friend
|
||||
- mark my words
|
||||
- meaningful dialogue
|
||||
- missed the boat on that one
|
||||
- moment in the sun
|
||||
- moment of glory
|
||||
- moment of truth
|
||||
- money to burn
|
||||
- more power to you
|
||||
- more than one way to skin a cat
|
||||
- movers and shakers
|
||||
- moving experience
|
||||
- naked as a jaybird
|
||||
- naked truth
|
||||
- neat as a pin
|
||||
- needle in a haystack
|
||||
- needless to say
|
||||
- neither here nor there
|
||||
- never look back
|
||||
- never say never
|
||||
- nip and tuck
|
||||
- nip it in the bud
|
||||
- no guts, no glory
|
||||
- no love lost
|
||||
- no pain, no gain
|
||||
- no skin off my back
|
||||
- no stone unturned
|
||||
- no time like the present
|
||||
- no use crying over spilled milk
|
||||
- nose to the grindstone
|
||||
- not a hope in hell
|
||||
- not a minute's peace
|
||||
- not in my backyard
|
||||
- not playing with a full deck
|
||||
- not the end of the world
|
||||
- not written in stone
|
||||
- nothing to sneeze at
|
||||
- nothing ventured nothing gained
|
||||
- now we're cooking
|
||||
- off the top of my head
|
||||
- off the wagon
|
||||
- off the wall
|
||||
- old hat
|
||||
- older and wiser
|
||||
- older than dirt
|
||||
- older than Methuselah
|
||||
- on a roll
|
||||
- on cloud nine
|
||||
- on pins and needles
|
||||
- on the bandwagon
|
||||
- on the money
|
||||
- on the nose
|
||||
- on the rocks
|
||||
- on the spot
|
||||
- on the tip of my tongue
|
||||
- on the wagon
|
||||
- on thin ice
|
||||
- once bitten, twice shy
|
||||
- one bad apple doesn't spoil the bushel
|
||||
- one born every minute
|
||||
- one brick short
|
||||
- one foot in the grave
|
||||
- one in a million
|
||||
- one red cent
|
||||
- only game in town
|
||||
- open a can of worms
|
||||
- open and shut case
|
||||
- open the flood gates
|
||||
- opportunity doesn't knock twice
|
||||
- out of pocket
|
||||
- out of sight, out of mind
|
||||
- out of the frying pan into the fire
|
||||
- out of the woods
|
||||
- out on a limb
|
||||
- over a barrel
|
||||
- over the hump
|
||||
- pain and suffering
|
||||
- pain in the
|
||||
- panic button
|
||||
- par for the course
|
||||
- part and parcel
|
||||
- party pooper
|
||||
- pass the buck
|
||||
- patience is a virtue
|
||||
- pay through the nose
|
||||
- penny pincher
|
||||
- perfect storm
|
||||
- pig in a poke
|
||||
- pile it on
|
||||
- pillar of the community
|
||||
- pin your hopes on
|
||||
- pitter patter of little feet
|
||||
- plain as day
|
||||
- plain as the nose on your face
|
||||
- play by the rules
|
||||
- play your cards right
|
||||
- playing the field
|
||||
- playing with fire
|
||||
- pleased as punch
|
||||
- plenty of fish in the sea
|
||||
- point with pride
|
||||
- poor as a church mouse
|
||||
- pot calling the kettle black
|
||||
- pretty as a picture
|
||||
- pull a fast one
|
||||
- pull your punches
|
||||
- pulling your leg
|
||||
- pure as the driven snow
|
||||
- put it in a nutshell
|
||||
- put one over on you
|
||||
- put the cart before the horse
|
||||
- put the pedal to the metal
|
||||
- put your best foot forward
|
||||
- put your foot down
|
||||
- quick as a bunny
|
||||
- quick as a lick
|
||||
- quick as a wink
|
||||
- quick as lightning
|
||||
- quiet as a dormouse
|
||||
- rags to riches
|
||||
- raining buckets
|
||||
- raining cats and dogs
|
||||
- rank and file
|
||||
- rat race
|
||||
- reap what you sow
|
||||
- red as a beet
|
||||
- red herring
|
||||
- reinvent the wheel
|
||||
- rich and famous
|
||||
- rings a bell
|
||||
- ripe old age
|
||||
- ripped me off
|
||||
- rise and shine
|
||||
- road to hell is paved with good intentions
|
||||
- rob Peter to pay Paul
|
||||
- roll over in the grave
|
||||
- rub the wrong way
|
||||
- ruled the roost
|
||||
- running in circles
|
||||
- sad but true
|
||||
- sadder but wiser
|
||||
- salt of the earth
|
||||
- scared stiff
|
||||
- scared to death
|
||||
- sealed with a kiss
|
||||
- second to none
|
||||
- see eye to eye
|
||||
- seen the light
|
||||
- seize the day
|
||||
- set the record straight
|
||||
- set the world on fire
|
||||
- set your teeth on edge
|
||||
- sharp as a tack
|
||||
- shoot for the moon
|
||||
- shoot the breeze
|
||||
- shot in the dark
|
||||
- shoulder to the wheel
|
||||
- sick as a dog
|
||||
- sigh of relief
|
||||
- signed, sealed, and delivered
|
||||
- sink or swim
|
||||
- six of one, half a dozen of another
|
||||
- skating on thin ice
|
||||
- slept like a log
|
||||
- slinging mud
|
||||
- slippery as an eel
|
||||
- slow as molasses
|
||||
- smart as a whip
|
||||
- smooth as a baby's bottom
|
||||
- sneaking suspicion
|
||||
- snug as a bug in a rug
|
||||
- sow wild oats
|
||||
- spare the rod, spoil the child
|
||||
- speak of the devil
|
||||
- spilled the beans
|
||||
- spinning your wheels
|
||||
- spitting image of
|
||||
- spoke with relish
|
||||
- spread like wildfire
|
||||
- spring to life
|
||||
- squeaky wheel gets the grease
|
||||
- stands out like a sore thumb
|
||||
- start from scratch
|
||||
- stick in the mud
|
||||
- still waters run deep
|
||||
- stitch in time
|
||||
- stop and smell the roses
|
||||
- straight as an arrow
|
||||
- straw that broke the camel's back
|
||||
- strong as an ox
|
||||
- stubborn as a mule
|
||||
- stuff that dreams are made of
|
||||
- stuffed shirt
|
||||
- sweating blood
|
||||
- sweating bullets
|
||||
- take a load off
|
||||
- take one for the team
|
||||
- take the bait
|
||||
- take the bull by the horns
|
||||
- take the plunge
|
||||
- takes one to know one
|
||||
- takes two to tango
|
||||
- the more the merrier
|
||||
- the real deal
|
||||
- the real McCoy
|
||||
- the red carpet treatment
|
||||
- the same old story
|
||||
- there is no accounting for taste
|
||||
- thick as a brick
|
||||
- thick as thieves
|
||||
- thin as a rail
|
||||
- think outside of the box
|
||||
- third time's the charm
|
||||
- this day and age
|
||||
- this hurts me worse than it hurts you
|
||||
- this point in time
|
||||
- three sheets to the wind
|
||||
- through thick and thin
|
||||
- throw in the towel
|
||||
- tie one on
|
||||
- tighter than a drum
|
||||
- time and time again
|
||||
- time is of the essence
|
||||
- tip of the iceberg
|
||||
- tired but happy
|
||||
- to coin a phrase
|
||||
- to each his own
|
||||
- to make a long story short
|
||||
- to the best of my knowledge
|
||||
- toe the line
|
||||
- tongue in cheek
|
||||
- too good to be true
|
||||
- too hot to handle
|
||||
- too numerous to mention
|
||||
- touch with a ten foot pole
|
||||
- tough as nails
|
||||
- trial and error
|
||||
- trials and tribulations
|
||||
- tried and true
|
||||
- trip down memory lane
|
||||
- twist of fate
|
||||
- two cents worth
|
||||
- two peas in a pod
|
||||
- ugly as sin
|
||||
- under the counter
|
||||
- under the gun
|
||||
- under the same roof
|
||||
- under the weather
|
||||
- until the cows come home
|
||||
- unvarnished truth
|
||||
- up the creek
|
||||
- uphill battle
|
||||
- upper crust
|
||||
- upset the applecart
|
||||
- vain attempt
|
||||
- vain effort
|
||||
- vanquish the enemy
|
||||
- vested interest
|
||||
- waiting for the other shoe to drop
|
||||
- wakeup call
|
||||
- warm welcome
|
||||
- watch your p's and q's
|
||||
- watch your tongue
|
||||
- watching the clock
|
||||
- water under the bridge
|
||||
- weather the storm
|
||||
- weed them out
|
||||
- week of Sundays
|
||||
- went belly up
|
||||
- wet behind the ears
|
||||
- what goes around comes around
|
||||
- what you see is what you get
|
||||
- when it rains, it pours
|
||||
- when push comes to shove
|
||||
- when the cat's away
|
||||
- when the going gets tough, the tough get going
|
||||
- white as a sheet
|
||||
- whole ball of wax
|
||||
- whole hog
|
||||
- whole nine yards
|
||||
- wild goose chase
|
||||
- will wonders never cease?
|
||||
- wisdom of the ages
|
||||
- wise as an owl
|
||||
- wolf at the door
|
||||
- words fail me
|
||||
- work like a dog
|
||||
- world weary
|
||||
- worst nightmare
|
||||
- worth its weight in gold
|
||||
- wrong side of the bed
|
||||
- yanking your chain
|
||||
- yappy as a dog
|
||||
- years young
|
||||
- you are what you eat
|
||||
- you can run but you can't hide
|
||||
- you only live once
|
||||
- you're the boss
|
||||
- young and foolish
|
||||
- young and vibrant
|
||||
32
.vale/styles/write-good/E-Prime.yml
Normal file
@ -0,0 +1,32 @@
|
||||
extends: existence
|
||||
message: "Try to avoid using '%s'."
|
||||
ignorecase: true
|
||||
level: suggestion
|
||||
tokens:
|
||||
- am
|
||||
- are
|
||||
- aren't
|
||||
- be
|
||||
- been
|
||||
- being
|
||||
- he's
|
||||
- here's
|
||||
- here's
|
||||
- how's
|
||||
- i'm
|
||||
- is
|
||||
- isn't
|
||||
- it's
|
||||
- she's
|
||||
- that's
|
||||
- there's
|
||||
- they're
|
||||
- was
|
||||
- wasn't
|
||||
- we're
|
||||
- were
|
||||
- weren't
|
||||
- what's
|
||||
- where's
|
||||
- who's
|
||||
- you're
|
||||
11
.vale/styles/write-good/Illusions.yml
Normal file
@ -0,0 +1,11 @@
|
||||
extends: repetition
|
||||
message: "'%s' is repeated!"
|
||||
level: warning
|
||||
alpha: true
|
||||
action:
|
||||
name: edit
|
||||
params:
|
||||
- truncate
|
||||
- " "
|
||||
tokens:
|
||||
- '[^\s]+'
|
||||
183
.vale/styles/write-good/Passive.yml
Normal file
@ -0,0 +1,183 @@
|
||||
extends: existence
|
||||
message: "'%s' may be passive voice. Use active voice if you can."
|
||||
ignorecase: true
|
||||
level: warning
|
||||
raw:
|
||||
- \b(am|are|were|being|is|been|was|be)\b\s*
|
||||
tokens:
|
||||
- '[\w]+ed'
|
||||
- awoken
|
||||
- beat
|
||||
- become
|
||||
- been
|
||||
- begun
|
||||
- bent
|
||||
- beset
|
||||
- bet
|
||||
- bid
|
||||
- bidden
|
||||
- bitten
|
||||
- bled
|
||||
- blown
|
||||
- born
|
||||
- bought
|
||||
- bound
|
||||
- bred
|
||||
- broadcast
|
||||
- broken
|
||||
- brought
|
||||
- built
|
||||
- burnt
|
||||
- burst
|
||||
- cast
|
||||
- caught
|
||||
- chosen
|
||||
- clung
|
||||
- come
|
||||
- cost
|
||||
- crept
|
||||
- cut
|
||||
- dealt
|
||||
- dived
|
||||
- done
|
||||
- drawn
|
||||
- dreamt
|
||||
- driven
|
||||
- drunk
|
||||
- dug
|
||||
- eaten
|
||||
- fallen
|
||||
- fed
|
||||
- felt
|
||||
- fit
|
||||
- fled
|
||||
- flown
|
||||
- flung
|
||||
- forbidden
|
||||
- foregone
|
||||
- forgiven
|
||||
- forgotten
|
||||
- forsaken
|
||||
- fought
|
||||
- found
|
||||
- frozen
|
||||
- given
|
||||
- gone
|
||||
- gotten
|
||||
- ground
|
||||
- grown
|
||||
- heard
|
||||
- held
|
||||
- hidden
|
||||
- hit
|
||||
- hung
|
||||
- hurt
|
||||
- kept
|
||||
- knelt
|
||||
- knit
|
||||
- known
|
||||
- laid
|
||||
- lain
|
||||
- leapt
|
||||
- learnt
|
||||
- led
|
||||
- left
|
||||
- lent
|
||||
- let
|
||||
- lighted
|
||||
- lost
|
||||
- made
|
||||
- meant
|
||||
- met
|
||||
- misspelt
|
||||
- mistaken
|
||||
- mown
|
||||
- overcome
|
||||
- overdone
|
||||
- overtaken
|
||||
- overthrown
|
||||
- paid
|
||||
- pled
|
||||
- proven
|
||||
- put
|
||||
- quit
|
||||
- read
|
||||
- rid
|
||||
- ridden
|
||||
- risen
|
||||
- run
|
||||
- rung
|
||||
- said
|
||||
- sat
|
||||
- sawn
|
||||
- seen
|
||||
- sent
|
||||
- set
|
||||
- sewn
|
||||
- shaken
|
||||
- shaven
|
||||
- shed
|
||||
- shod
|
||||
- shone
|
||||
- shorn
|
||||
- shot
|
||||
- shown
|
||||
- shrunk
|
||||
- shut
|
||||
- slain
|
||||
- slept
|
||||
- slid
|
||||
- slit
|
||||
- slung
|
||||
- smitten
|
||||
- sold
|
||||
- sought
|
||||
- sown
|
||||
- sped
|
||||
- spent
|
||||
- spilt
|
||||
- spit
|
||||
- split
|
||||
- spoken
|
||||
- spread
|
||||
- sprung
|
||||
- spun
|
||||
- stolen
|
||||
- stood
|
||||
- stridden
|
||||
- striven
|
||||
- struck
|
||||
- strung
|
||||
- stuck
|
||||
- stung
|
||||
- stunk
|
||||
- sung
|
||||
- sunk
|
||||
- swept
|
||||
- swollen
|
||||
- sworn
|
||||
- swum
|
||||
- swung
|
||||
- taken
|
||||
- taught
|
||||
- thought
|
||||
- thrived
|
||||
- thrown
|
||||
- thrust
|
||||
- told
|
||||
- torn
|
||||
- trodden
|
||||
- understood
|
||||
- upheld
|
||||
- upset
|
||||
- wed
|
||||
- wept
|
||||
- withheld
|
||||
- withstood
|
||||
- woken
|
||||
- won
|
||||
- worn
|
||||
- wound
|
||||
- woven
|
||||
- written
|
||||
- wrung
|
||||
27
.vale/styles/write-good/README.md
Normal file
@ -0,0 +1,27 @@
|
||||
Based on [write-good](https://github.com/btford/write-good).
|
||||
|
||||
> Naive linter for English prose for developers who can't write good and wanna learn to do other stuff good too.
|
||||
|
||||
```
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 Brian Ford
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
```
|
||||
5
.vale/styles/write-good/So.yml
Normal file
@ -0,0 +1,5 @@
|
||||
extends: existence
|
||||
message: "Don't start a sentence with '%s'."
|
||||
level: error
|
||||
raw:
|
||||
- '(?:[;-]\s)so[\s,]|\bSo[\s,]'
|
||||
6
.vale/styles/write-good/ThereIs.yml
Normal file
@ -0,0 +1,6 @@
|
||||
extends: existence
|
||||
message: "Don't start a sentence with '%s'."
|
||||
ignorecase: false
|
||||
level: error
|
||||
raw:
|
||||
- '(?:[;-]\s)There\s(is|are)|\bThere\s(is|are)\b'
|
||||
221
.vale/styles/write-good/TooWordy.yml
Normal file
@ -0,0 +1,221 @@
|
||||
extends: existence
|
||||
message: "'%s' is too wordy."
|
||||
ignorecase: true
|
||||
level: warning
|
||||
tokens:
|
||||
- a number of
|
||||
- abundance
|
||||
- accede to
|
||||
- accelerate
|
||||
- accentuate
|
||||
- accompany
|
||||
- accomplish
|
||||
- accorded
|
||||
- accrue
|
||||
- acquiesce
|
||||
- acquire
|
||||
- additional
|
||||
- adjacent to
|
||||
- adjustment
|
||||
- admissible
|
||||
- advantageous
|
||||
- adversely impact
|
||||
- advise
|
||||
- aforementioned
|
||||
- aggregate
|
||||
- aircraft
|
||||
- all of
|
||||
- all things considered
|
||||
- alleviate
|
||||
- allocate
|
||||
- along the lines of
|
||||
- already existing
|
||||
- alternatively
|
||||
- amazing
|
||||
- ameliorate
|
||||
- anticipate
|
||||
- apparent
|
||||
- appreciable
|
||||
- as a matter of fact
|
||||
- as a means of
|
||||
- as far as I'm concerned
|
||||
- as of yet
|
||||
- as to
|
||||
- as yet
|
||||
- ascertain
|
||||
- assistance
|
||||
- at the present time
|
||||
- at this time
|
||||
- attain
|
||||
- attributable to
|
||||
- authorize
|
||||
- because of the fact that
|
||||
- belated
|
||||
- benefit from
|
||||
- bestow
|
||||
- by means of
|
||||
- by virtue of
|
||||
- by virtue of the fact that
|
||||
- cease
|
||||
- close proximity
|
||||
- commence
|
||||
- comply with
|
||||
- concerning
|
||||
- consequently
|
||||
- consolidate
|
||||
- constitutes
|
||||
- demonstrate
|
||||
- depart
|
||||
- designate
|
||||
- discontinue
|
||||
- due to the fact that
|
||||
- each and every
|
||||
- economical
|
||||
- eliminate
|
||||
- elucidate
|
||||
- employ
|
||||
- endeavor
|
||||
- enumerate
|
||||
- equitable
|
||||
- equivalent
|
||||
- evaluate
|
||||
- evidenced
|
||||
- exclusively
|
||||
- expedite
|
||||
- expend
|
||||
- expiration
|
||||
- facilitate
|
||||
- factual evidence
|
||||
- feasible
|
||||
- finalize
|
||||
- first and foremost
|
||||
- for all intents and purposes
|
||||
- for the most part
|
||||
- for the purpose of
|
||||
- forfeit
|
||||
- formulate
|
||||
- have a tendency to
|
||||
- honest truth
|
||||
- however
|
||||
- if and when
|
||||
- impacted
|
||||
- implement
|
||||
- in a manner of speaking
|
||||
- in a timely manner
|
||||
- in a very real sense
|
||||
- in accordance with
|
||||
- in addition
|
||||
- in all likelihood
|
||||
- in an effort to
|
||||
- in between
|
||||
- in excess of
|
||||
- in lieu of
|
||||
- in light of the fact that
|
||||
- in many cases
|
||||
- in my opinion
|
||||
- in order to
|
||||
- in regard to
|
||||
- in some instances
|
||||
- in terms of
|
||||
- in the case of
|
||||
- in the event that
|
||||
- in the final analysis
|
||||
- in the nature of
|
||||
- in the near future
|
||||
- in the process of
|
||||
- inception
|
||||
- incumbent upon
|
||||
- indicate
|
||||
- indication
|
||||
- initiate
|
||||
- irregardless
|
||||
- is applicable to
|
||||
- is authorized to
|
||||
- is responsible for
|
||||
- it is
|
||||
- it is essential
|
||||
- it seems that
|
||||
- it was
|
||||
- magnitude
|
||||
- maximum
|
||||
- methodology
|
||||
- minimize
|
||||
- minimum
|
||||
- modify
|
||||
- monitor
|
||||
- multiple
|
||||
- necessitate
|
||||
- nevertheless
|
||||
- not certain
|
||||
- not many
|
||||
- not often
|
||||
- not unless
|
||||
- not unlike
|
||||
- notwithstanding
|
||||
- null and void
|
||||
- numerous
|
||||
- objective
|
||||
- obligate
|
||||
- obtain
|
||||
- on the contrary
|
||||
- on the other hand
|
||||
- one particular
|
||||
- optimum
|
||||
- overall
|
||||
- owing to the fact that
|
||||
- participate
|
||||
- particulars
|
||||
- pass away
|
||||
- pertaining to
|
||||
- point in time
|
||||
- portion
|
||||
- possess
|
||||
- preclude
|
||||
- previously
|
||||
- prior to
|
||||
- prioritize
|
||||
- procure
|
||||
- proficiency
|
||||
- provided that
|
||||
- purchase
|
||||
- put simply
|
||||
- readily apparent
|
||||
- refer back
|
||||
- regarding
|
||||
- relocate
|
||||
- remainder
|
||||
- remuneration
|
||||
- requirement
|
||||
- reside
|
||||
- residence
|
||||
- retain
|
||||
- satisfy
|
||||
- shall
|
||||
- should you wish
|
||||
- similar to
|
||||
- solicit
|
||||
- span across
|
||||
- strategize
|
||||
- subsequent
|
||||
- substantial
|
||||
- successfully complete
|
||||
- sufficient
|
||||
- terminate
|
||||
- the month of
|
||||
- the point I am trying to make
|
||||
- therefore
|
||||
- time period
|
||||
- took advantage of
|
||||
- transmit
|
||||
- transpire
|
||||
- type of
|
||||
- until such time as
|
||||
- utilization
|
||||
- utilize
|
||||
- validate
|
||||
- various different
|
||||
- what I mean to say is
|
||||
- whether or not
|
||||
- with respect to
|
||||
- with the exception of
|
||||
- witnessed
|
||||
29
.vale/styles/write-good/Weasel.yml
Normal file
@ -0,0 +1,29 @@
|
||||
extends: existence
|
||||
message: "'%s' is a weasel word!"
|
||||
ignorecase: true
|
||||
level: warning
|
||||
tokens:
|
||||
- clearly
|
||||
- completely
|
||||
- exceedingly
|
||||
- excellent
|
||||
- extremely
|
||||
- fairly
|
||||
- huge
|
||||
- interestingly
|
||||
- is a number
|
||||
- largely
|
||||
- mostly
|
||||
- obviously
|
||||
- quite
|
||||
- relatively
|
||||
- remarkably
|
||||
- several
|
||||
- significantly
|
||||
- substantially
|
||||
- surprisingly
|
||||
- tiny
|
||||
- usually
|
||||
- various
|
||||
- vast
|
||||
- very
|
||||
4
.vale/styles/write-good/meta.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"feed": "https://github.com/errata-ai/write-good/releases.atom",
|
||||
"vale_version": ">=1.0.0"
|
||||
}
|
||||
45
.woodpecker/Dockerfile
Normal file
@ -0,0 +1,45 @@
|
||||
# Custom Docker image for Woodpecker CI
|
||||
# Pre-installs common tools to speed up CI runs
|
||||
#
|
||||
# Build: docker build -t your-registry/ci:latest -f .woodpecker/Dockerfile .
|
||||
# Push: docker push your-registry/ci:latest
|
||||
#
|
||||
# Then update .woodpecker/ci.yml to use: image: your-registry/ci:latest
|
||||
|
||||
FROM rust:latest
|
||||
|
||||
# Install system dependencies
|
||||
RUN apt-get update && apt-get install -y \
|
||||
shellcheck \
|
||||
curl \
|
||||
git \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install just
|
||||
RUN curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to /usr/local/bin
|
||||
|
||||
# Install Rust components
|
||||
RUN rustup component add clippy rustfmt
|
||||
|
||||
# Install Rust tools (pre-compiled to speed up CI)
|
||||
RUN cargo install \
|
||||
cargo-audit \
|
||||
cargo-deny \
|
||||
cargo-sbom \
|
||||
nickel-lang-cli \
|
||||
nu \
|
||||
--locked
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /workspace
|
||||
|
||||
# Verify installations
|
||||
RUN just --version && \
|
||||
cargo --version && \
|
||||
cargo audit --version && \
|
||||
cargo deny --version && \
|
||||
cargo sbom --version && \
|
||||
nickel --version && \
|
||||
nu --version
|
||||
|
||||
CMD ["/bin/bash"]
|
||||
42
.woodpecker/Dockerfile.cross
Normal file
@ -0,0 +1,42 @@
|
||||
# Dockerfile for cross-platform compilation
|
||||
# Supports building for multiple targets using docker
|
||||
|
||||
FROM ubuntu:22.04
|
||||
|
||||
# Install build essentials
|
||||
RUN apt-get update && apt-get install -y \
|
||||
build-essential \
|
||||
curl \
|
||||
git \
|
||||
pkg-config \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install Rust
|
||||
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable
|
||||
ENV PATH="/root/.cargo/bin:${PATH}"
|
||||
|
||||
# Install cross tool for cross-compilation
|
||||
RUN cargo install cross --locked
|
||||
|
||||
# Create workspace directory
|
||||
WORKDIR /workspace
|
||||
|
||||
# Copy entire project
|
||||
COPY . .
|
||||
|
||||
# Default build target
|
||||
ARG TARGET=x86_64-unknown-linux-gnu
|
||||
ENV BUILD_TARGET="${TARGET}"
|
||||
|
||||
# Build command
|
||||
RUN cross build --target "${BUILD_TARGET}" --release
|
||||
|
||||
# Extract binaries to output directory
|
||||
RUN mkdir -p /output/bin && \
|
||||
find target/"${BUILD_TARGET}"/release -maxdepth 1 -type f -executable -exec cp {} /output/bin/ \;
|
||||
|
||||
# Create manifest
|
||||
RUN echo "{ \"target\": \"${BUILD_TARGET}\", \"built\": \"$(date -u +'%Y-%m-%dT%H:%M:%SZ')\" }" > /output/BUILD_INFO.json
|
||||
|
||||
# Default command
|
||||
CMD ["/bin/bash"]
|
||||
78
.woodpecker/README.md
Normal file
@ -0,0 +1,78 @@
|
||||
# Woodpecker CI Configuration
|
||||
|
||||
Pipelines for Gitea/Forgejo + Woodpecker CI.
|
||||
|
||||
## Files
|
||||
|
||||
- **`ci.yml`** - Main CI pipeline (push, pull requests)
|
||||
- **`Dockerfile`** - Custom CI image with pre-installed tools
|
||||
- **`Dockerfile.cross`** - Cross-compilation image for multi-platform builds
|
||||
|
||||
## Setup
|
||||
|
||||
### 1. Activate Woodpecker CI
|
||||
|
||||
Enable Woodpecker CI in your Gitea/Forgejo repository settings.
|
||||
|
||||
### 2. (Optional) Build Custom Image
|
||||
|
||||
Speeds up CI by pre-installing tools (~5 min faster per run).
|
||||
|
||||
```bash
|
||||
# Build CI image
|
||||
docker build -t your-registry/ci:latest -f .woodpecker/Dockerfile .
|
||||
|
||||
# Push to your registry
|
||||
docker push your-registry/ci:latest
|
||||
|
||||
# Update .woodpecker/ci.yml
|
||||
# Change: image: rust:latest
|
||||
# To: image: your-registry/ci:latest
|
||||
```
|
||||
|
||||
### 3. Cross-Compilation Setup
|
||||
|
||||
For multi-platform builds:
|
||||
|
||||
```bash
|
||||
# Build cross-compilation image
|
||||
docker build -t your-registry/ci-cross:latest -f .woodpecker/Dockerfile.cross .
|
||||
|
||||
# Push to registry
|
||||
docker push your-registry/ci-cross:latest
|
||||
```
|
||||
|
||||
## CI Pipeline (`ci.yml`)
|
||||
|
||||
**Triggers**: Push to `main`/`develop`, Pull Requests
|
||||
|
||||
**Jobs**:
|
||||
1. Lint (Rust, Bash, Nickel, Nushell, Markdown) - Parallel
|
||||
2. Test (all features)
|
||||
3. Build (release)
|
||||
4. Security audit
|
||||
5. License compliance check
|
||||
|
||||
**Duration**: ~15-20 minutes (without custom image), ~10-15 minutes (with custom image)
|
||||
|
||||
## Triggering Pipelines
|
||||
|
||||
```bash
|
||||
# CI pipeline (automatic on push/PR)
|
||||
git push origin main
|
||||
```
|
||||
|
||||
## Viewing Results
|
||||
|
||||
- **Gitea/Forgejo**: Repository → Actions → Pipeline runs
|
||||
- **Woodpecker UI**: https://your-woodpecker.instance/repos/{user}/{repo}
|
||||
|
||||
## Differences from GitHub Actions
|
||||
|
||||
| Feature | GitHub Actions | Woodpecker CI |
|
||||
|---------|---------------|---------------|
|
||||
| Matrix builds | ✅ 3 OS | ❌ Linux only* |
|
||||
| Caching | ✅ Built-in | ⚠️ Server-side** |
|
||||
|
||||
\* Multi-OS builds require multiple Woodpecker agents
|
||||
\*\* Configure in Woodpecker server settings
|
||||
168
.woodpecker/ci-advanced.yml
Normal file
@ -0,0 +1,168 @@
|
||||
# Woodpecker CI - Advanced Pipeline
|
||||
# Multi-platform builds, coverage, benchmarks, and security scanning
|
||||
|
||||
when:
|
||||
event: [push, pull_request, manual]
|
||||
branch:
|
||||
- main
|
||||
- develop
|
||||
|
||||
matrix:
|
||||
PLATFORM:
|
||||
- linux/amd64
|
||||
- linux/arm64
|
||||
|
||||
steps:
|
||||
# === LINTING (Parallel) ===
|
||||
|
||||
lint-rust:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to /usr/local/bin
|
||||
- rustup component add clippy rustfmt
|
||||
- cargo fmt --all -- --check
|
||||
- cargo clippy --all-targets --all-features -- -D warnings
|
||||
environment:
|
||||
CARGO_TERM_COLOR: always
|
||||
|
||||
lint-bash:
|
||||
image: koalaman/shellcheck-alpine:stable
|
||||
commands:
|
||||
- apk add --no-cache curl bash
|
||||
- find . -name '*.sh' -type f ! -path './target/*' -exec shellcheck {} +
|
||||
|
||||
lint-nickel:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- cargo install nickel-lang-cli --locked
|
||||
- find . -name '*.ncl' -type f ! -path './target/*' -exec nickel typecheck {} \;
|
||||
|
||||
lint-nushell:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- cargo install nu --locked
|
||||
- find . -name '*.nu' -type f ! -path './target/*' -exec nu --ide-check 100 {} \;
|
||||
|
||||
lint-markdown:
|
||||
image: node:alpine
|
||||
commands:
|
||||
- npm install -g markdownlint-cli2
|
||||
- markdownlint-cli2 '**/*.md' '#node_modules' '#target'
|
||||
|
||||
# === TESTING ===
|
||||
|
||||
test:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- cargo test --workspace --all-features --no-fail-fast
|
||||
depends_on:
|
||||
- lint-rust
|
||||
- lint-bash
|
||||
- lint-nickel
|
||||
- lint-nushell
|
||||
- lint-markdown
|
||||
environment:
|
||||
RUST_BACKTRACE: 1
|
||||
|
||||
# === CODE COVERAGE ===
|
||||
|
||||
coverage:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- cargo install cargo-tarpaulin --locked
|
||||
- cargo tarpaulin --workspace --all-features --out Xml --output-dir coverage
|
||||
- |
|
||||
if [ -f coverage/cobertura.xml ]; then
|
||||
echo "Coverage report generated successfully"
|
||||
fi
|
||||
depends_on:
|
||||
- test
|
||||
when:
|
||||
event: [push, pull_request]
|
||||
branch: [main, develop]
|
||||
|
||||
# === BUILD (Multi-platform) ===
|
||||
|
||||
build-native:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- cargo build --release --workspace
|
||||
- ls -lh target/release/
|
||||
depends_on:
|
||||
- test
|
||||
|
||||
build-cross:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- cargo install cross --locked
|
||||
- cross build --target x86_64-unknown-linux-musl --release
|
||||
- cross build --target aarch64-unknown-linux-musl --release
|
||||
depends_on:
|
||||
- test
|
||||
when:
|
||||
matrix:
|
||||
PLATFORM: linux/amd64
|
||||
|
||||
# === BENCHMARKS ===
|
||||
|
||||
benchmark:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- rustup toolchain install nightly
|
||||
- cargo +nightly bench --workspace --no-fail-fast
|
||||
- |
|
||||
if [ -d target/criterion ]; then
|
||||
echo "Benchmark results available in target/criterion"
|
||||
fi
|
||||
depends_on:
|
||||
- build-native
|
||||
when:
|
||||
event: pull_request
|
||||
|
||||
# === SECURITY AUDITS ===
|
||||
|
||||
security-audit:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- cargo install cargo-audit --locked
|
||||
- cargo audit --deny warnings --deny unmaintained --deny unsound
|
||||
depends_on:
|
||||
- lint-rust
|
||||
|
||||
license-check:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- cargo install cargo-deny --locked
|
||||
- cargo deny check licenses advisories sources bans
|
||||
depends_on:
|
||||
- lint-rust
|
||||
|
||||
dependency-check:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- cargo install cargo-outdated --locked
|
||||
- cargo outdated --exit-code 1 --root-deps-only
|
||||
depends_on:
|
||||
- lint-rust
|
||||
when:
|
||||
event: manual
|
||||
|
||||
# === SONARQUBE ANALYSIS ===
|
||||
|
||||
sonarqube:
|
||||
image: sonarsource/sonar-scanner-cli:latest
|
||||
commands:
|
||||
- |
|
||||
sonar-scanner \
|
||||
-Dsonar.projectKey=${CI_REPO_NAME} \
|
||||
-Dsonar.sources=. \
|
||||
-Dsonar.host.url=${SONAR_HOST_URL} \
|
||||
-Dsonar.token=${SONAR_TOKEN} \
|
||||
-Dsonar.rust.clippy.reportPaths=clippy-report.json \
|
||||
-Dsonar.coverageReportPaths=coverage/cobertura.xml
|
||||
depends_on:
|
||||
- coverage
|
||||
secrets: [sonar_host_url, sonar_token]
|
||||
when:
|
||||
event: [push, pull_request]
|
||||
branch: [main, develop]
|
||||
84
.woodpecker/ci.yml
Normal file
@ -0,0 +1,84 @@
|
||||
# Woodpecker CI Pipeline
|
||||
# Equivalent to GitHub Actions CI workflow
|
||||
# Generated by dev-system/ci
|
||||
|
||||
when:
|
||||
event: [push, pull_request, manual]
|
||||
branch:
|
||||
- main
|
||||
- develop
|
||||
|
||||
steps:
|
||||
# === LINTING ===
|
||||
|
||||
lint-rust:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to /usr/local/bin
|
||||
- rustup component add clippy
|
||||
- cargo fmt --all -- --check
|
||||
- cargo clippy --all-targets -- -D warnings
|
||||
|
||||
lint-bash:
|
||||
image: koalaman/shellcheck-alpine:stable
|
||||
commands:
|
||||
- apk add --no-cache curl bash
|
||||
- find . -name '*.sh' -type f ! -path './target/*' -exec shellcheck {} +
|
||||
|
||||
lint-nickel:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- cargo install nickel-lang-cli --locked
|
||||
- find . -name '*.ncl' -type f ! -path './target/*' -exec nickel typecheck {} \;
|
||||
|
||||
lint-nushell:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- cargo install nu --locked
|
||||
- find . -name '*.nu' -type f ! -path './target/*' -exec nu --ide-check 100 {} \;
|
||||
|
||||
lint-markdown:
|
||||
image: node:alpine
|
||||
commands:
|
||||
- npm install -g markdownlint-cli2
|
||||
- markdownlint-cli2 '**/*.md' '#node_modules' '#target'
|
||||
|
||||
# === TESTING ===
|
||||
|
||||
test:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- cargo test --workspace --all-features
|
||||
depends_on:
|
||||
- lint-rust
|
||||
- lint-bash
|
||||
- lint-nickel
|
||||
- lint-nushell
|
||||
- lint-markdown
|
||||
|
||||
# === BUILD ===
|
||||
|
||||
build:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- cargo build --release
|
||||
depends_on:
|
||||
- test
|
||||
|
||||
# === SECURITY ===
|
||||
|
||||
security-audit:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- cargo install cargo-audit --locked
|
||||
- cargo audit --deny warnings
|
||||
depends_on:
|
||||
- lint-rust
|
||||
|
||||
license-check:
|
||||
image: rust:latest
|
||||
commands:
|
||||
- cargo install cargo-deny --locked
|
||||
- cargo deny check licenses advisories
|
||||
depends_on:
|
||||
- lint-rust
|
||||
18
.yamllint-ci.yml
Normal file
@ -0,0 +1,18 @@
|
||||
extends: default
|
||||
|
||||
rules:
|
||||
line-length:
|
||||
max: 200 # More reasonable for infrastructure code
|
||||
comments:
|
||||
min-spaces-from-content: 1 # Allow single space before comments
|
||||
document-start: disable # Cloud-init files don't need --- start
|
||||
truthy:
|
||||
allowed-values: ["true", "false", "yes", "no", "on", "off"] # Allow cloud-init and GitHub Actions common values
|
||||
|
||||
# Ignore cloud-init files for comment spacing since #cloud-config is a special directive
|
||||
# Ignore directories with generated/runtime files
|
||||
ignore: |
|
||||
**/cloud-init.yml
|
||||
build/**
|
||||
data/**
|
||||
envs/**
|
||||
103
CODE_OF_CONDUCT.md
Normal file
@ -0,0 +1,103 @@
|
||||
# Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We, as members, contributors, and leaders, pledge to make participation in our project and community a harassment-free experience for everyone, regardless of:
|
||||
|
||||
- Age
|
||||
- Body size
|
||||
- Visible or invisible disability
|
||||
- Ethnicity
|
||||
- Sex characteristics
|
||||
- Gender identity and expression
|
||||
- Level of experience
|
||||
- Education
|
||||
- Socioeconomic status
|
||||
- Nationality
|
||||
- Personal appearance
|
||||
- Race
|
||||
- Caste
|
||||
- Color
|
||||
- Religion
|
||||
- Sexual identity and orientation
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our community include:
|
||||
|
||||
- Demonstrating empathy and kindness toward other people
|
||||
- Being respectful of differing opinions, viewpoints, and experiences
|
||||
- Giving and gracefully accepting constructive feedback
|
||||
- Accepting responsibility and apologizing to those affected by mistakes
|
||||
- Focusing on what is best not just for us as individuals, but for the overall community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
- The use of sexualized language or imagery
|
||||
- Trolling, insulting, or derogatory comments
|
||||
- Personal or political attacks
|
||||
- Public or private harassment
|
||||
- Publishing others' private information (doxing)
|
||||
- Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate corrective action in response to unacceptable behavior.
|
||||
|
||||
Maintainers have the right and responsibility to:
|
||||
|
||||
- Remove, edit, or reject comments, commits, code, and other contributions
|
||||
- Ban contributors for behavior they deem inappropriate, threatening, or harmful
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies to:
|
||||
|
||||
- All community spaces (GitHub, forums, chat, events, etc.)
|
||||
- Official project channels and representations
|
||||
- Interactions between community members related to the project
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to project maintainers:
|
||||
|
||||
- Email: [project contact]
|
||||
- GitHub: Private security advisory
|
||||
- Issues: Report with `conduct` label (public discussions only)
|
||||
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
### Enforcement Guidelines
|
||||
|
||||
**1. Correction**
|
||||
- Community impact: Use of inappropriate language or unwelcoming behavior
|
||||
- Action: Private written warning with explanation and clarity on impact
|
||||
- Consequence: Warning and no further violations
|
||||
|
||||
**2. Warning**
|
||||
- Community impact: Violation through single incident or series of actions
|
||||
- Action: Written warning with severity consequences for continued behavior
|
||||
- Consequence: Suspension from community interaction
|
||||
|
||||
**3. Temporary Ban**
|
||||
- Community impact: Serious violation of standards
|
||||
- Action: Temporary ban from community interaction
|
||||
- Consequence: Revocation of ban after reflection period
|
||||
|
||||
**4. Permanent Ban**
|
||||
- Community impact: Pattern of violating community standards
|
||||
- Action: Permanent ban from community interaction
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 2.1.
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq.
|
||||
|
||||
---
|
||||
|
||||
**Thank you for being part of our community!**
|
||||
|
||||
We believe in creating a welcoming and inclusive space where everyone can contribute their best work. Together, we make this project better.
|
||||
129
CONTRIBUTING.md
Normal file
@ -0,0 +1,129 @@
|
||||
# Contributing to
|
||||
|
||||
Thank you for your interest in contributing! This document provides guidelines and instructions for contributing to this project.
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
This project adheres to a Code of Conduct. By participating, you are expected to uphold this code. Please see [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) for details.
|
||||
|
||||
## Getting Started
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Rust 1.70+ (if project uses Rust)
|
||||
- NuShell (if project uses Nushell scripts)
|
||||
- Git
|
||||
|
||||
### Development Setup
|
||||
|
||||
1. Fork the repository
|
||||
2. Clone your fork: `git clone `
|
||||
3. Add upstream: `git remote add upstream `
|
||||
4. Create a branch: `git checkout -b feature/your-feature`
|
||||
|
||||
## Development Workflow
|
||||
|
||||
### Before You Code
|
||||
|
||||
- Check existing issues and pull requests to avoid duplication
|
||||
- Create an issue to discuss major changes before implementing
|
||||
- Assign yourself to let others know you're working on it
|
||||
|
||||
### Code Standards
|
||||
|
||||
#### Rust
|
||||
|
||||
- Run `cargo fmt --all` before committing
|
||||
- All code must pass `cargo clippy -- -D warnings`
|
||||
- Write tests for new functionality
|
||||
- Maintain 100% documentation coverage for public APIs
|
||||
|
||||
#### Nushell
|
||||
|
||||
- Validate scripts with `nu --ide-check 100 script.nu`
|
||||
- Follow consistent naming conventions
|
||||
- Use type hints where applicable
|
||||
|
||||
#### Nickel
|
||||
|
||||
- Type check schemas with `nickel typecheck`
|
||||
- Document schema fields with comments
|
||||
- Test schema validation
|
||||
|
||||
### Commit Guidelines
|
||||
|
||||
- Write clear, descriptive commit messages
|
||||
- Reference issues with `Fixes #123` or `Related to #123`
|
||||
- Keep commits focused on a single concern
|
||||
- Use imperative mood: "Add feature" not "Added feature"
|
||||
|
||||
### Testing
|
||||
|
||||
All changes must include tests:
|
||||
|
||||
```bash
|
||||
# Run all tests
|
||||
cargo test --workspace
|
||||
|
||||
# Run with coverage
|
||||
cargo llvm-cov --all-features --lcov
|
||||
|
||||
# Run locally before pushing
|
||||
just ci-full
|
||||
```
|
||||
|
||||
### Pull Request Process
|
||||
|
||||
1. Update documentation for any changed functionality
|
||||
2. Add tests for new code
|
||||
3. Ensure all CI checks pass
|
||||
4. Request review from maintainers
|
||||
5. Be responsive to feedback and iterate quickly
|
||||
|
||||
## Review Process
|
||||
|
||||
- Maintainers will review your PR within 3-5 business days
|
||||
- Feedback is constructive and meant to improve the code
|
||||
- All discussions should be respectful and professional
|
||||
- Once approved, maintainers will merge the PR
|
||||
|
||||
## Reporting Bugs
|
||||
|
||||
Found a bug? Please file an issue with:
|
||||
|
||||
- **Title**: Clear, descriptive title
|
||||
- **Description**: What happened and what you expected
|
||||
- **Steps to reproduce**: Minimal reproducible example
|
||||
- **Environment**: OS, Rust version, etc.
|
||||
- **Screenshots**: If applicable
|
||||
|
||||
## Suggesting Enhancements
|
||||
|
||||
Have an idea? Please file an issue with:
|
||||
|
||||
- **Title**: Clear feature title
|
||||
- **Description**: What, why, and how
|
||||
- **Use cases**: Real-world scenarios where this would help
|
||||
- **Alternative approaches**: If you've considered any
|
||||
|
||||
## Documentation
|
||||
|
||||
- Keep README.md up to date
|
||||
- Document public APIs with rustdoc comments
|
||||
- Add examples for non-obvious functionality
|
||||
- Update CHANGELOG.md with your changes
|
||||
|
||||
## Release Process
|
||||
|
||||
Maintainers handle releases following semantic versioning:
|
||||
- MAJOR: Breaking changes
|
||||
- MINOR: New features (backward compatible)
|
||||
- PATCH: Bug fixes
|
||||
|
||||
## Questions?
|
||||
|
||||
- Check existing documentation and issues
|
||||
- Ask in discussions or open an issue
|
||||
- Join our community channels
|
||||
|
||||
Thank you for contributing!
|
||||
235
README.md
Normal file
@ -0,0 +1,235 @@
|
||||
<div align="center">
|
||||
<img src="assets/logos/stratumiops-h.svg" alt="StratumIOps Logo" width="600" />
|
||||
</div>
|
||||
|
||||
# StratumIOps
|
||||
|
||||
**Infrastructure operations, AI agent orchestration, knowledge management, secrets management, and configuration generation.**
|
||||
|
||||
Five integrated Rust projects. One ecosystem. Zero compromises.
|
||||
|
||||
---
|
||||
|
||||
## The 4 Problems It Solves
|
||||
|
||||
### 01 · Scattered Knowledge
|
||||
Decisions in Slack, guidelines in wikis, patterns in docs—all disconnected. **Kogral** unifies knowledge with git-native markdown and MCP for AI agents.
|
||||
|
||||
### 02 · Uncontrolled LLM Costs
|
||||
|
||||
No visibility or limits on AI spending per team. **Vapora** provides real-time budgets, automatic fallback to cheaper
|
||||
providers, and expertise-based agent routing.
|
||||
|
||||
### 03 · Fragile YAML Configuration
|
||||
Runtime errors from untyped configuration. **Provisioning** uses Nickel with pre-runtime validation, **TypeDialog** generates forms with contract validation.
|
||||
|
||||
### 04 · Static Cryptography
|
||||
No preparation for quantum threats. **SecretumVault** implements production post-quantum crypto (ML-KEM-768, ML-DSA-65) with pluggable backends today.
|
||||
|
||||
---
|
||||
|
||||
## Ecosystem Projects
|
||||
|
||||
| Project | Description | Metrics |
|
||||
| ------- | ----------- | ------- |
|
||||
| **[Vapora](https://repo.jesusperez.pro/jesus/vapora)** | AI agent orchestration with learning and cost control | 13 crates, 218 tests, 50K LOC |
|
||||
| **[Kogral](https://repo.jesusperez.pro/jesus/kogral)** | Knowledge graph with MCP for Claude Code | 3 crates, 56 tests, 15K LOC |
|
||||
| **[TypeDialog](https://repo.jesusperez.pro/jesus/typedialog)** | Multi-backend forms (CLI, TUI, Web, AI, Agent, Prov-gen) | 8 crates, 3,818 tests, 90K LOC |
|
||||
| **[Provisioning](https://repo.jesusperez.pro/jesus/provisioning)** | Declarative IaC with Nickel + AI-assisted generation | 15+ crates, 218 tests, 40K LOC |
|
||||
| **[SecretumVault](https://repo.jesusperez.pro/jesus/secretumvault)** | Secrets management with post-quantum cryptography | 1 crate, 50+ tests, 11K LOC |
|
||||
|
||||
### Vapora · AI Agent Orchestration
|
||||
|
||||
AI agent orchestration with learning and cost control. Agents improve from experience, automatic budget fallback, NATS JetStream coordination.
|
||||
|
||||
- AI agent orchestration with learning
|
||||
- Agents improve from experience
|
||||
- Automatic budget fallback
|
||||
- NATS JetStream coordination
|
||||
- 13 crates, 218 tests, 50K LOC
|
||||
|
||||
### Kogral · Knowledge Graph
|
||||
|
||||
Knowledge graph with MCP for Claude Code. 6 node types (Notes, ADRs, Guidelines, Patterns, Journals, Executions). Git-native markdown with semantic search.
|
||||
|
||||
- Knowledge graph with MCP for Claude Code
|
||||
- 6 node types: Notes, ADRs, Guidelines, Patterns, Journals, Executions
|
||||
- Git-native markdown storage
|
||||
- Semantic search with embeddings
|
||||
- 3 crates, 56 tests, 15K LOC
|
||||
|
||||
### TypeDialog · Multi-Backend Forms
|
||||
|
||||
Multi-backend forms (CLI, TUI, Web, AI, Agent, Prov-gen). One TOML definition, 6 interfaces. Nickel contract validation.
|
||||
|
||||
- 6 backends: CLI, TUI, Web, AI, Agent, Prov-gen
|
||||
- One TOML definition for all interfaces
|
||||
- Nickel contract validation
|
||||
- Conditional fields & repeating groups
|
||||
- 8 crates, 3,818 tests, 90K LOC
|
||||
|
||||
### Provisioning · Declarative IaC
|
||||
|
||||
Declarative IaC with Nickel + AI-assisted generation. Multi-cloud (AWS, UpCloud, Local), RAG with 1,200+ docs, MCP server, orchestrator with rollback.
|
||||
|
||||
- Declarative IaC with Nickel + AI-assisted generation
|
||||
- Multi-cloud: AWS, UpCloud, Local (LXD)
|
||||
- RAG with 1,200+ domain docs
|
||||
- MCP server for natural language queries
|
||||
- Orchestrator with automatic rollback
|
||||
- 15+ crates, 218 tests, 40K LOC
|
||||
|
||||
### SecretumVault · Secrets Management
|
||||
|
||||
Secrets management with post-quantum crypto. ML-KEM-768, ML-DSA-65 (NIST FIPS 203/204). 4 crypto backends, 4 storage backends, 4 secrets engines.
|
||||
|
||||
- Post-quantum crypto: ML-KEM-768, ML-DSA-65 (NIST FIPS 203/204)
|
||||
- 4 crypto backends: OpenSSL, OQS, AWS-LC, RustCrypto
|
||||
- 4 storage backends: Filesystem, etcd, SurrealDB, PostgreSQL
|
||||
- 4 secrets engines: KV, Transit, PKI, Database
|
||||
- Shamir Secret Sharing for unsealing
|
||||
- 1 crate, 50+ tests, 11K LOC
|
||||
|
||||
---
|
||||
|
||||
## Technology Stack
|
||||
|
||||
- **Languages**: Rust Edition 2021, Nickel, Nushell, Bash, Markdown
|
||||
- **Databases**: SurrealDB (multi-tenant), etcd (HA), PostgreSQL (enterprise)
|
||||
- **Messaging**: NATS JetStream (durable, ordered)
|
||||
- **Frameworks**: Axum (REST), Leptos (WASM), Ratatui (TUI)
|
||||
- **Crypto**: OpenSSL, OQS (Post-Quantum), AWS-LC, RustCrypto
|
||||
- **Observability**: Prometheus, OpenTelemetry, Grafana
|
||||
|
||||
---
|
||||
|
||||
## Ecosystem Metrics
|
||||
|
||||
| Metric | Value |
|
||||
| ------ | ----- |
|
||||
| **Total Rust crates** | 40+ |
|
||||
| **Total tests** | 4,360+ |
|
||||
| **Total LOC** | ~206K |
|
||||
| **Clippy warnings** | 0 |
|
||||
| **Unsafe code blocks** | 0 |
|
||||
| **Public API doc coverage** | 100% |
|
||||
| **Crypto backends** | 4 (OpenSSL, OQS, AWS-LC, RustCrypto) |
|
||||
| **Storage backends** | 4 (Filesystem, etcd, SurrealDB, PostgreSQL) |
|
||||
| **TypeDialog backends** | 6 (CLI, TUI, Web, AI, Agent, Prov-gen) |
|
||||
| **MCP Tools** | 14+ |
|
||||
| **Multi-Cloud Support** | AWS, UpCloud, Local (LXD) |
|
||||
| **Post-Quantum Ready** | Yes (ML-KEM-768, ML-DSA-65) |
|
||||
|
||||
---
|
||||
|
||||
## What is StratumIOps
|
||||
|
||||
StratumIOps is not a single project. It's the **orchestration layer** that coordinates:
|
||||
|
||||
- **Documentation**: Unified docs for all ecosystem projects (bilingual en/es)
|
||||
- **Branding Assets**: Logos, color schemes, web landing pages
|
||||
- **Integration Patterns**: How projects work together
|
||||
- **Shared Standards**: Language guidelines (Rust, Nickel, Nushell, Bash)
|
||||
|
||||
### Documentation Structure
|
||||
|
||||
```text
|
||||
docs/
|
||||
├── en/ # English documentation
|
||||
│ ├── ia/ # AI/Development track
|
||||
│ └── ops/ # Ops/DevOps track
|
||||
└── es/ # Spanish documentation
|
||||
├── ia/ # AI/Development track
|
||||
└── ops/ # Ops/DevOps track
|
||||
```
|
||||
|
||||
### Branding Assets
|
||||
|
||||
Complete branding system with 18+ assets:
|
||||
|
||||
- **8 Logo variants**: Horizontal, vertical, animated, static, dark mode
|
||||
- **4 Icon variants**: Animated, static, dark mode
|
||||
- **4 Monochrome variants**: Black/white for print and accessibility
|
||||
- **2 Social variants**: Optimized for social platforms (1080×1080)
|
||||
- **2 Favicon variants**: Browser tabs (16×16, 32×32)
|
||||
|
||||
See [assets/branding/README.md](assets/branding/README.md) for detailed guidelines.
|
||||
|
||||
---
|
||||
|
||||
## Integration Patterns
|
||||
|
||||
### Example: Kogral → Vapora
|
||||
|
||||
```rust
|
||||
// Vapora agent queries Kogral for guidelines before generating code
|
||||
async fn get_project_context(task: &Task) -> Result<ProjectContext> {
|
||||
let kogral = KogralMcpClient::connect().await?;
|
||||
|
||||
let guidelines = kogral.call("get_guidelines", json!({
|
||||
"topic": &task.task_type,
|
||||
"include_shared": true,
|
||||
})).await?;
|
||||
|
||||
Ok(ProjectContext { guidelines })
|
||||
}
|
||||
```
|
||||
|
||||
### Example: TypeDialog → Provisioning
|
||||
|
||||
```rust
|
||||
// TypeDialog prov-gen backend generates Nickel for Provisioning
|
||||
async fn generate_infrastructure(form_response: &FormResponse) -> Result<WorkflowId> {
|
||||
let generator = ProvGenBackend::new();
|
||||
let iac = generator.generate(&form_response.into()).await?;
|
||||
|
||||
let provisioning = ProvisioningClient::connect().await?;
|
||||
let workflow_id = provisioning.submit_workflow(iac).await?;
|
||||
|
||||
Ok(workflow_id)
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Related Projects
|
||||
|
||||
| Project | Local Path | Git Repo |
|
||||
| ------- | ---------- | -------- |
|
||||
| vapora | `/Users/Akasha/Development/vapora` | `https://repo.jesusperez.pro/jesus/vapora` |
|
||||
| kogra | `/Users/Akasha/Development/kogral` | `https://repo.jesusperez.pro/jesus/kogra` |
|
||||
| typedialog | `/Users/Akasha/Development/typedialog` | `https://repo.jesusperez.pro/jesus/typedialog` |
|
||||
| provisioning | `/Users/Akasha/project-provisioning/provisioning` | `https://repo.jesusperez.pro/jesus/provisioning` |
|
||||
| secretumvault | `/Users/Akasha/Development/secretumvault` | `https://repo.jesusperez.pro/jesus/secretumvault` |
|
||||
|
||||
---
|
||||
|
||||
## Contributing
|
||||
|
||||
See [CONTRIBUTING.md](CONTRIBUTING.md) for development guidelines, code standards, and pull request process.
|
||||
|
||||
## Security
|
||||
|
||||
See [SECURITY.md](SECURITY.md) for security policy, vulnerability reporting, and security best practices.
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
See [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) for community guidelines and expected behavior.
|
||||
|
||||
## License
|
||||
|
||||
Proprietary / To be defined
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
|
||||
**StratumIOps v0.1.0**
|
||||
|
||||
*Integrated ecosystem with Rust excellence ✨*
|
||||
|
||||
Infrastructure Operations | AI Orchestration | Knowledge Management | Secrets & Configuration
|
||||
|
||||
**100% Rust. Zero compromises.**
|
||||
|
||||
</div>
|
||||
98
SECURITY.md
Normal file
@ -0,0 +1,98 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
This project provides security updates for the following versions:
|
||||
|
||||
| Version | Supported |
|
||||
|---------|-----------|
|
||||
| 1.x | ✅ Yes |
|
||||
| 0.x | ❌ No |
|
||||
|
||||
Only the latest major version receives security patches. Users are encouraged to upgrade to the latest version.
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
**Do not open public GitHub issues for security vulnerabilities.**
|
||||
|
||||
Instead, please report security issues to the maintainers privately:
|
||||
|
||||
### Reporting Process
|
||||
|
||||
1. Email security details to the maintainers (see project README for contact)
|
||||
2. Include:
|
||||
- Description of the vulnerability
|
||||
- Steps to reproduce (if possible)
|
||||
- Potential impact
|
||||
- Suggested fix (if you have one)
|
||||
|
||||
3. Expect acknowledgment within 48 hours
|
||||
4. We will work on a fix and coordinate disclosure timing
|
||||
|
||||
### Responsible Disclosure
|
||||
|
||||
- Allow reasonable time for a fix before public disclosure
|
||||
- Work with us to understand and validate the issue
|
||||
- Maintain confidentiality until the fix is released
|
||||
|
||||
## Security Best Practices
|
||||
|
||||
### For Users
|
||||
|
||||
- Keep dependencies up to date
|
||||
- Use the latest version of this project
|
||||
- Review security advisories regularly
|
||||
- Report vulnerabilities responsibly
|
||||
|
||||
### For Contributors
|
||||
|
||||
- Run `cargo audit` before submitting PRs
|
||||
- Use `cargo deny` to check license compliance
|
||||
- Follow secure coding practices
|
||||
- Don't hardcode secrets or credentials
|
||||
- Validate all external inputs
|
||||
|
||||
## Dependency Security
|
||||
|
||||
We use automated tools to monitor dependencies:
|
||||
|
||||
- **cargo-audit**: Scans for known security vulnerabilities
|
||||
- **cargo-deny**: Checks licenses and bans unsafe dependencies
|
||||
|
||||
These run in CI on every push and PR.
|
||||
|
||||
## Code Review
|
||||
|
||||
All code changes go through review before merging:
|
||||
- At least one maintainer review required
|
||||
- Security implications considered
|
||||
- Tests required for all changes
|
||||
- CI checks must pass
|
||||
|
||||
## Known Vulnerabilities
|
||||
|
||||
We maintain transparency about known issues:
|
||||
- Documented in GitHub security advisories
|
||||
- Announced in release notes
|
||||
- Tracked in issues with `security` label
|
||||
|
||||
## Security Contact
|
||||
|
||||
For security inquiries, please contact:
|
||||
- Email: [project maintainers]
|
||||
- Issue: Open a private security advisory on GitHub
|
||||
|
||||
## Changelog
|
||||
|
||||
Security fixes are highlighted in CHANGELOG.md with [SECURITY] prefix.
|
||||
|
||||
## Resources
|
||||
|
||||
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
|
||||
- [CWE: Common Weakness Enumeration](https://cwe.mitre.org/)
|
||||
- [Rust Security](https://www.rust-lang.org/governance/security-disclosures)
|
||||
- [npm Security](https://docs.npmjs.com/about-npm/security)
|
||||
|
||||
## Questions?
|
||||
|
||||
If you have security questions (not vulnerabilities), open a discussion or issue with the `security` label.
|
||||
239
assets/branding/README.md
Normal file
@ -0,0 +1,239 @@
|
||||
# StratumIOps Branding Assets
|
||||
|
||||
Complete branding system for StratumIOps - Intelligent Infrastructure Operations platform.
|
||||
|
||||
## Directory Structure
|
||||
|
||||
```text
|
||||
branding/
|
||||
├── README.md # This file
|
||||
├── index.html # Quick reference showcase
|
||||
└── stratumiops-assets-showcase.html # Comprehensive assets catalog
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
Open either HTML file in your browser to view the interactive branding showcase:
|
||||
|
||||
- **`index.html`** - Compact version with dark/light mode toggle
|
||||
- **`stratumiops-assets-showcase.html`** - Full-featured showcase with navigation, statistics, comparison tables, and detailed guidelines
|
||||
|
||||
## Asset Categories
|
||||
|
||||
### Logo Variants (8 total)
|
||||
|
||||
All logos are available in the `../logos/` directory:
|
||||
|
||||
| Variant | Dimensions | Features | Use Case |
|
||||
|---------|------------|----------|----------|
|
||||
| `stratumiops-h.svg` | 1200×300px | Animated | Banners, headers |
|
||||
| `stratumiops-v.svg` | 400×520px | Animated | Posters, vertical UI |
|
||||
| `stratumiops-h-static.svg` | 1200×300px | Static bars | Print, documents |
|
||||
| `stratumiops-v-static.svg` | 400×520px | Static bars | Print, documents |
|
||||
| `stratumiops-dark-h.svg` | 1200×300px | Dark BG, glow | Dark mode UI |
|
||||
| `stratumiops-dark-v.svg` | 400×520px | Dark BG, glow | Dark mode UI |
|
||||
|
||||
### Icon Variants (4 total)
|
||||
|
||||
All icons feature layered architecture with central processor design:
|
||||
|
||||
| Variant | Dimensions | Features | Use Case |
|
||||
|---------|------------|----------|----------|
|
||||
| `stratumiops-icon.svg` | 512×512px | Animated particles | App icons, UI |
|
||||
| `stratumiops-icon-static.svg` | 512×512px | Static | Print, static UI |
|
||||
| `stratumiops-icon-dark.svg` | 512×512px | Dark BG, particles | Dark mode apps |
|
||||
| `stratumiops-icon-dark-static.svg` | 512×512px | Dark BG, static | Dark mode print |
|
||||
|
||||
### Monochrome Variants (4 total)
|
||||
|
||||
Black and white versions for print and accessibility:
|
||||
|
||||
| Variant | Dimensions | Use Case |
|
||||
|---------|------------|----------|
|
||||
| `stratumiops-mono-black-h.svg` | 1200×300px | Print, documents (light BG) |
|
||||
| `stratumiops-mono-black-v.svg` | 400×520px | Print, documents (light BG) |
|
||||
| `stratumiops-mono-white-h.svg` | 1200×300px | Dark backgrounds |
|
||||
| `stratumiops-mono-white-v.svg` | 400×520px | Dark backgrounds |
|
||||
|
||||
### Social & Favicons (4 total)
|
||||
|
||||
Optimized for social platforms and browser tabs:
|
||||
|
||||
| Variant | Dimensions | Use Case |
|
||||
|---------|------------|----------|
|
||||
| `stratumiops-social-square-dark.svg` | 1080×1080px | Social profiles (dark) |
|
||||
| `stratumiops-social-square-light.svg` | 1080×1080px | Social profiles (light) |
|
||||
| `stratumiops-favicon-16.svg` | 16×16px | Browser tabs |
|
||||
| `stratumiops-favicon-32.svg` | 32×32px | Browser tabs |
|
||||
|
||||
## Color Palette
|
||||
|
||||
Core brand colors with semantic meaning:
|
||||
|
||||
- **Primary Indigo** (`#6366F1`) - Main brand identity, primary actions
|
||||
- **Secondary Indigo** (`#4F46E5`) - Gradients, depth, secondary elements
|
||||
- **Cyan Accent** (`#22D3EE`) - Highlights, active states, energy
|
||||
- **Cyan Dark** (`#06B6D4`) - Processor core, technical elements
|
||||
- **Slate** (`#64748b`) - Secondary text, borders, subtle elements
|
||||
- **Dark Background** (`#0F172A`) - Dark mode UI, backgrounds
|
||||
|
||||
## Usage Guidelines
|
||||
|
||||
### Logo Sizing
|
||||
|
||||
- Use horizontal variants for banners, headers, and wide layouts
|
||||
- Use vertical variants for posters, splash screens, and tall layouts
|
||||
- Maintain minimum 20px clear space around all logos
|
||||
- Never distort, rotate, or modify the aspect ratio
|
||||
- Prefer animated variants for digital applications with animation support
|
||||
|
||||
### Color Usage
|
||||
|
||||
- Primary Indigo (#6366F1) is the main brand color for all primary actions
|
||||
- Cyan (#22D3EE) highlights active states and the central processor element
|
||||
- Use gradients (Primary to Secondary Indigo, or Primary to Cyan) for visual depth
|
||||
- Dark variants use enhanced glow effects for optimal dark mode visibility
|
||||
- Monochrome variants ensure accessibility in all contexts
|
||||
|
||||
### Animations
|
||||
|
||||
- Animated variants include:
|
||||
- Flowing particle paths between layers
|
||||
- Pulsing equalizer bars in the central processor
|
||||
- Synchronized glow effects
|
||||
- Use static variants for print, emails, or contexts without animation support
|
||||
- Animations are preserved in SVG format and scale responsively
|
||||
|
||||
### Dark Mode
|
||||
|
||||
- Dark variants (`-dark-h`, `-dark-v`, `-icon-dark`) optimized for dark backgrounds
|
||||
- Enhanced glow and lighter stroke weights for visibility
|
||||
- Mono-white variants for pure black backgrounds
|
||||
- Ensure WCAG AA contrast compliance in all implementations
|
||||
|
||||
### Digital Applications
|
||||
|
||||
- All assets are SVG format for infinite scalability
|
||||
- Use favicon variants (16×16, 32×32) for browser tabs and bookmarks
|
||||
- Social square variants (1080×1080) are optimized for profile pictures
|
||||
- Icons (512×512) work for app icons, PWA icons, and large UI elements
|
||||
- Export to PNG at 2x or 3x resolution for high-DPI displays when needed
|
||||
|
||||
### Print Production
|
||||
|
||||
- Use static variants for print materials to ensure consistent output
|
||||
- Monochrome black variants work for single-color prints
|
||||
- Test on actual materials before production
|
||||
- Ensure minimum 1/4" clear space around all logos
|
||||
- Export to high-resolution PDF or PNG (300 DPI minimum) when needed
|
||||
|
||||
### Social Media
|
||||
|
||||
- Use `stratumiops-social-square-dark.svg` for dark-themed profiles
|
||||
- Use `stratumiops-social-square-light.svg` for light-themed profiles
|
||||
- Horizontal variants work for banners and cover images
|
||||
- Always export at 2x scale for retina/high-DPI displays
|
||||
- Provide alt-text: "StratumIOps - Intelligent Infrastructure Operations"
|
||||
|
||||
### Accessibility
|
||||
|
||||
- All color combinations meet WCAG AA contrast standards
|
||||
- Monochrome variants ensure colorblind accessibility
|
||||
- Use descriptive alt-text for all logo images
|
||||
- Animated variants do not flash or strobe (safe for photosensitivity)
|
||||
- Dark/light variants provide optimal visibility in all contexts
|
||||
|
||||
## Asset Features
|
||||
|
||||
✨ **Interactive HTML Showcases**
|
||||
|
||||
- Dark/light mode toggle with localStorage persistence
|
||||
- Responsive grid layouts for all screen sizes
|
||||
- One-click filename copy to clipboard
|
||||
- Sticky navigation with smooth scrolling (showcase version)
|
||||
- Color palette visualization with HEX codes
|
||||
- Comprehensive comparison tables
|
||||
|
||||
🎨 **SVG Animations**
|
||||
|
||||
- Flowing particle paths between infrastructure layers
|
||||
- Pulsing equalizer bars in central processor
|
||||
- Smooth glow effects on layers and I/O points
|
||||
- Synchronized animations across all elements
|
||||
|
||||
📊 **Format & Scalability**
|
||||
|
||||
- All assets in SVG format
|
||||
- Infinite scalability without quality loss
|
||||
- Animations preserved across all sizes
|
||||
- Print-ready static and monochrome variants
|
||||
- Favicon variants optimized for browser rendering
|
||||
|
||||
## File Sizes
|
||||
|
||||
- Logo variants: ~4-6KB each (animated), ~3-4KB (static)
|
||||
- Icon variants: ~3-5KB each (animated), ~2-3KB (static)
|
||||
- Monochrome variants: ~2-3KB each
|
||||
- Social/Favicon variants: ~1-3KB each
|
||||
- HTML showcases: index.html (~18KB), showcase (~30KB)
|
||||
|
||||
## Technical Specifications
|
||||
|
||||
### SVG Features
|
||||
|
||||
- Linear gradients for depth and visual interest
|
||||
- SMIL animations for particle flows and pulsing effects
|
||||
- Optimized viewBox dimensions for each variant
|
||||
- Clean, minimal markup for fast loading
|
||||
|
||||
### Design Elements
|
||||
|
||||
- **Layers**: Three horizontal bars representing infrastructure strata
|
||||
- **Flows**: Curved paths showing data flow between layers
|
||||
- **Processor**: Central rectangle with internal elements (equalizer bars)
|
||||
- **I/O Points**: Circles marking input/output connections
|
||||
- **Particles**: Animated circles flowing along connection paths
|
||||
|
||||
## Version Information
|
||||
|
||||
- **Last Updated:** 2026-01-22
|
||||
- **Version:** 1.0
|
||||
- **Format:** SVG + HTML5
|
||||
- **Compatibility:** All modern browsers
|
||||
- **Total Assets:** 18 (8 logos, 4 icons, 4 mono, 2 social, 2 favicons)
|
||||
|
||||
## Brand Identity
|
||||
|
||||
**StratumIOps** represents:
|
||||
|
||||
- 🏗️ Layered infrastructure architecture
|
||||
- ⚡ Intelligent automation and operations
|
||||
- 🔄 Data flows across system boundaries
|
||||
- 🎛️ Central processing and orchestration
|
||||
- 🌐 Modern, animated visual identity
|
||||
- 🔧 DevOps, GitOps, and infrastructure as code
|
||||
|
||||
## Design Philosophy
|
||||
|
||||
The StratumIOps visual identity communicates:
|
||||
|
||||
1. **Layered Architecture**: Three horizontal bars represent infrastructure layers (compute, storage, network)
|
||||
2. **Data Flow**: Curved connection paths show information flow between layers
|
||||
3. **Central Processing**: The processor element represents orchestration and intelligence
|
||||
4. **Technical Precision**: Clean lines, geometric shapes, and systematic organization
|
||||
5. **Energy and Motion**: Animations convey active processing and continuous operation
|
||||
|
||||
## Related Assets
|
||||
|
||||
- Logo variants: `/assets/logos/stratumiops-*.svg`
|
||||
- Icon variants: `/assets/logos/stratumiops-icon*.svg`
|
||||
- Monochrome variants: `/assets/logos/stratumiops-mono-*.svg`
|
||||
- Social/Favicon variants: `/assets/logos/stratumiops-social-*.svg`, `/assets/logos/stratumiops-favicon-*.svg`
|
||||
|
||||
## Contact & Updates
|
||||
|
||||
For asset requests, updates, or branding questions, refer to the StratumIOps project documentation.
|
||||
|
||||
---
|
||||
|
||||
**All assets in the StratumIOps branding system are optimized for scalability, accessibility, and brand consistency across digital and print media.**
|
||||
1438
assets/branding/index.html
Normal file
8
assets/branding/stratumiops-ascii.txt
Normal file
@ -0,0 +1,8 @@
|
||||
╔═╗┌┬┐┬─┐┌─┐┌┬┐┬ ┬┌┬┐ ╦ ┌─┐┌─┐┌─┐
|
||||
╚═╗ │ ├┬┘├─┤ │ │ ││││ ║ │ │├─┘└─┐
|
||||
╚═╝ ┴ ┴└─┴ ┴ ┴ └─┘┴ ┴ ╩ └─┘┴ └─┘
|
||||
╔═══════════════════════════════════════╗
|
||||
║ Infrastructure operations hub ║
|
||||
║ for STRATUMIOPS projects ecosystem ║
|
||||
║ stratumiops.dev ║
|
||||
╚═══════════════════════════════════════╝
|
||||
1984
assets/branding/stratumiops-assets-showcase.html
Normal file
476
assets/en/stratumiops-brand-strategy.md
Normal file
@ -0,0 +1,476 @@
|
||||
# StratumIOps: Brand Strategy and Business Model
|
||||
|
||||
## Executive Summary
|
||||
|
||||
| Aspect | Decision |
|
||||
|---------|----------|
|
||||
| **Name** | StratumIOps |
|
||||
| **Pronunciation** | "Stratum-I-Ops" |
|
||||
| **Tagline** | "Intelligent layers. Automated operations." |
|
||||
| **Model** | Open Core + Enterprise + Services |
|
||||
| **Target** | Mid-market tech companies (50-500 devs) |
|
||||
| **Differentiator** | Only Rust-native integrated platform with AI |
|
||||
| **Domain** | stratumiops.dev
|
||||
|
||||
---
|
||||
|
||||
## 1. Name and Branding
|
||||
|
||||
### Selected Name: StratumIOps
|
||||
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ │
|
||||
│ ███████╗████████╗██████╗ █████╗ ████████╗██╗ ██╗███╗ ███╗
|
||||
│ ██╔════╝╚══██╔══╝██╔══██╗██╔══██╗╚══██╔══╝██║ ██║████╗ ████║
|
||||
│ ███████╗ ██║ ██████╔╝███████║ ██║ ██║ ██║██╔████╔██║
|
||||
│ ╚════██║ ██║ ██╔══██╗██╔══██║ ██║ ██║ ██║██║╚██╔╝██║
|
||||
│ ███████║ ██║ ██║ ██║██║ ██║ ██║ ╚██████╔╝██║ ╚═╝ ██║
|
||||
│ ╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝
|
||||
│ ██████╗ ██████╗ ███████╗
|
||||
│ ██╔═══██╗██╔══██╗██╔════╝
|
||||
│ ██║ ██║██████╔╝███████╗
|
||||
│ ██║ ██║██╔═══╝ ╚════██║
|
||||
│ ╚██████╔╝██║ ███████║
|
||||
│ ╚═════╝ ╚═╝ ╚══════╝
|
||||
│ │
|
||||
│ "Intelligent layers. Automated operations." │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Rationale
|
||||
|
||||
| Criterion | Evaluation |
|
||||
|----------|------------|
|
||||
| **Tech-feel** | "-Ops" suffix immediately tech-recognizable (GitOps, DevOps, MLOps, AIOps) |
|
||||
| **Metaphor** | "Stratum" = layers. Each project is a layer of the stack |
|
||||
| **Market fit** | Connects with Platform Engineering / DevOps market |
|
||||
| **Scalability** | Allows adding more "layers" in the future |
|
||||
| **Bilingual** | Works equally well in English and Spanish |
|
||||
| **Availability** | stratumiops.dev / stratumiops.io likely available |
|
||||
| **Differentiation** | No direct competitors with that name |
|
||||
| **Memorable** | Easy to remember, not too long |
|
||||
|
||||
### Alternatives Considered
|
||||
|
||||
| Name | Concept | Reason for Rejection |
|
||||
|--------|----------|-------------------|
|
||||
| STRATUMIOPS (alone) | Geological layers | Lacks tech-feel, stratum.dev unavailable |
|
||||
| NEXUS | Connection point | Overused in tech |
|
||||
| Layerix | Layers + tech suffix | Invented, less recognizable |
|
||||
| Forgelayer | Forge + layers | Longer, less memorable |
|
||||
| DevSTRATUMIOPS | Dev + layers | Sounds generic |
|
||||
|
||||
---
|
||||
|
||||
## 2. Brand Architecture
|
||||
|
||||
### Product Hierarchy
|
||||
|
||||
```text
|
||||
StratumIOps
|
||||
"Intelligent layers.
|
||||
Automated operations."
|
||||
│
|
||||
┌────────────────┼────────────────┐
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
┌──────────┐ ┌──────────┐ ┌────────────┐
|
||||
│StratumIOps│ │StratumIOps│ │ StratumIOps │
|
||||
│ Core │ │ Pro │ │ Enterprise │
|
||||
│ (OSS) │ │(License) │ │ (Support) │
|
||||
└──────────┘ └──────────┘ └────────────┘
|
||||
```
|
||||
|
||||
### Products Under the Umbrella
|
||||
|
||||
| Product | Origin | Public Name | Tagline |
|
||||
|----------|--------|----------------|---------|
|
||||
| Kogral | Knowledge Graph | StratumIOps/knowledge | "Capture and query team knowledge" |
|
||||
| Vapora | Orchestration | StratumIOps/orchestrate | "Coordinate agents and workflows" |
|
||||
| TypeDialog | Forms/Automation | StratumIOps/interact | "Universal forms and automation" |
|
||||
| Provisioning | Infrastructure | StratumIOps/provision | "Infrastructure as typed code" |
|
||||
|
||||
### Visualization
|
||||
|
||||
```text
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ StratumIOps/knowledge ←── Kogral │
|
||||
│ "Capture and query team knowledge" │
|
||||
├──────────────────────────────────────────────────────────────┤
|
||||
│ StratumIOps/orchestrate ←── Vapora │
|
||||
│ "Coordinate agents and development workflows" │
|
||||
├──────────────────────────────────────────────────────────────┤
|
||||
│ StratumIOps/interact ←── TypeDialog │
|
||||
│ "Universal forms and automation" │
|
||||
├──────────────────────────────────────────────────────────────┤
|
||||
│ StratumIOps/provision ←── Provisioning │
|
||||
│ "Infrastructure as typed code" │
|
||||
└──────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Taglines
|
||||
|
||||
### Main Tagline
|
||||
|
||||
> **"Intelligent layers. Automated operations."**
|
||||
|
||||
### Context-Specific Variants
|
||||
|
||||
| Context | Tagline | Use |
|
||||
|----------|---------|-----|
|
||||
| **Main** | "Intelligent layers. Automated operations." | General branding |
|
||||
| **Technical** | "Stack intelligence. Automate everything." | Developer marketing |
|
||||
| **Flow** | "From knowledge to deployment. Automated." | Presentations |
|
||||
| **Benefits** | "Build smarter. Deploy faster." | Marketing, ads |
|
||||
| **Enterprise** | "The full-stack operations platform" | B2B sales |
|
||||
| **Pain point** | "Development without friction" | Landing pages |
|
||||
| **Kogral-centric** | "Where your team's knowledge becomes code" | Content marketing |
|
||||
|
||||
### Key Sales Message
|
||||
|
||||
> "StratumIOps is the only platform that unifies knowledge management, agent orchestration, universal forms, and infrastructure-as-code in a coherent Rust stack. No more 10 disconnected tools. No more lost knowledge. No more uncontrolled LLM costs. One ecosystem. Real integration."
|
||||
|
||||
---
|
||||
|
||||
## 4. Business Model
|
||||
|
||||
### 4.1 Open Core + Enterprise
|
||||
|
||||
#### FREE Tier (Open Source)
|
||||
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ StratumIOps FREE (OSS) │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ • Kogral core (knowledge graph, CLI, MCP) │
|
||||
│ • Vapora community (agents, basic routing) │
|
||||
│ • TypeDialog core (6 backends, forms) │
|
||||
│ • Provisioning community (AWS, basic orchestration) │
|
||||
│ • Single-tenant, self-hosted │
|
||||
│ • Community support (GitHub Issues) │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
#### PRO Tier (License)
|
||||
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ StratumIOps PRO ($X/user/month) │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ Everything in Free + │
|
||||
│ • Multi-tenant with SurrealDB scopes │
|
||||
│ • Advanced budget enforcement (alerts, dashboards) │
|
||||
│ • All cloud providers (GCP, Azure, Hetzner, UpCloud) │
|
||||
│ • SSO (SAML, OIDC) │
|
||||
│ • Priority support (48h SLA) │
|
||||
│ • Automatic updates │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
#### ENTERPRISE Tier (Custom)
|
||||
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ StratumIOps ENTERPRISE (Custom pricing) │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ Everything in Pro + │
|
||||
│ • Complete security layer (39K lines) │
|
||||
│ • Audit logging (7 years, 5 export formats) │
|
||||
│ • Advanced MFA (WebAuthn/FIDO2) │
|
||||
│ • 5 KMS backends │
|
||||
│ • Custom Cedar policies │
|
||||
│ • Multi-party break-glass │
|
||||
│ • Compliance packs (SOC2, HIPAA, GDPR) │
|
||||
│ • Dedicated support (4h SLA) │
|
||||
│ • Custom integrations │
|
||||
│ • On-premise deployment assistance │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 4.2 Professional Services
|
||||
|
||||
#### Implementation
|
||||
|
||||
| Service | Duration | Reference Rate |
|
||||
|----------|----------|-------------------|
|
||||
| Initial assessment | 1-2 days | €2,000 - €4,000 |
|
||||
| Basic implementation | 1 week | €8,000 - €15,000 |
|
||||
| Enterprise implementation | 1 month | €30,000 - €60,000 |
|
||||
| Migration from other tools | Variable | Custom |
|
||||
|
||||
#### Consulting
|
||||
|
||||
| Specialty | Rate/Day |
|
||||
|--------------|------------|
|
||||
| AI agent architecture | €1,500 |
|
||||
| Knowledge management strategy | €1,500 |
|
||||
| IaC modernization (Nickel) | €1,500 |
|
||||
| Security audit | €2,000 |
|
||||
|
||||
#### Premium Support
|
||||
|
||||
| Modality | Monthly Rate |
|
||||
|-----------|----------------|
|
||||
| Dedicated engineer | €5,000 - €10,000 |
|
||||
| 24/7 on-call support | €3,000 additional |
|
||||
| Quarterly business reviews | Included in Enterprise |
|
||||
|
||||
### 4.3 Training and Certification
|
||||
|
||||
#### StratumIOps Academy - Courses
|
||||
|
||||
| Course | Format | Price |
|
||||
|-------|---------|--------|
|
||||
| StratumIOps Fundamentals | Online, self-paced | €500 |
|
||||
| StratumIOps for DevOps | 2 days, in-person | €1,200 |
|
||||
| AI Agent Development with Vapora | 3 days | €1,800 |
|
||||
| Nickel IaC Masterclass | 2 days | €1,200 |
|
||||
| Enterprise Security Workshop | 1 day | €800 |
|
||||
|
||||
#### Certifications
|
||||
|
||||
| Certification | Exam |
|
||||
|---------------|--------|
|
||||
| StratumIOps Certified Developer (SOCD) | €300 |
|
||||
| StratumIOps Certified Architect (SOCA) | €500 |
|
||||
| StratumIOps Certified Administrator (SOCAD) | €400 |
|
||||
|
||||
#### Corporate Training
|
||||
|
||||
| Modality | Price |
|
||||
|-----------|--------|
|
||||
| Team training (up to 10 people) | €8,000/day |
|
||||
|
||||
---
|
||||
|
||||
## 5. Reputation Strategy
|
||||
|
||||
### 5.1 Thought Leadership
|
||||
|
||||
| Channel | Content |
|
||||
|-------|-----------|
|
||||
| **Tech blog** (stratumiops.dev/blog) | Rust architecture deep dives, comparisons vs Terraform/LangChain, case studies |
|
||||
| **YouTube** | Product demos, technical tutorials, conference talks |
|
||||
| **Newsletter** | Release notes, industry insights, tips & tricks |
|
||||
| **GitHub** | OSS contributions, example repos, community engagement |
|
||||
|
||||
### 5.2 Community Building
|
||||
|
||||
| Initiative | Purpose |
|
||||
|------------|-----------|
|
||||
| Discord/Slack community | Peer-to-peer support, feedback |
|
||||
| GitHub Discussions | Technical Q&A, public RFCs |
|
||||
| Virtual meetups (monthly) | Demos, AMA sessions |
|
||||
| Conference presence | RustConf, KubeCon, local meetups |
|
||||
| Open source contributions | Plugins, integrations, examples |
|
||||
|
||||
### 5.3 Technical Credibility
|
||||
|
||||
**Differentiators to communicate**:
|
||||
|
||||
| Metric | Message |
|
||||
|---------|---------|
|
||||
| 195K lines of Rust | Performance and type-safety |
|
||||
| 4,310+ tests | Quality and reliability |
|
||||
| 39K lines of security | Enterprise-ready |
|
||||
| Zero unsafe code | Security by design |
|
||||
| 100% documented APIs | Developer experience |
|
||||
| Full stack Rust | Technological consistency |
|
||||
|
||||
---
|
||||
|
||||
## 6. Competitive Positioning
|
||||
|
||||
### Positioning Map
|
||||
|
||||
```text
|
||||
ENTERPRISE FEATURES
|
||||
▲
|
||||
│
|
||||
Terraform/Pulumi │ ┌───────────┐
|
||||
● │ │StratumIOps │
|
||||
│ │ (here) │
|
||||
│ └───────────┘
|
||||
│
|
||||
───────────────────────┼───────────────────────▶
|
||||
SINGLE TOOL │ INTEGRATED PLATFORM
|
||||
│
|
||||
LangChain ● │
|
||||
│
|
||||
Notion ● │ ● Obsidian
|
||||
│
|
||||
│
|
||||
▼
|
||||
BASIC FEATURES
|
||||
```
|
||||
|
||||
### Positioning Statement
|
||||
|
||||
> "The only platform that integrates knowledge management, agent orchestration, forms automation, and IaC in a coherent Rust stack."
|
||||
|
||||
### Comparison with Alternatives
|
||||
|
||||
| Aspect | StratumIOps | Competition |
|
||||
|---------|------------|-------------|
|
||||
| **Stack** | End-to-end Rust | Python/JS/Go mix |
|
||||
| **Config** | Nickel (typed) | YAML/JSON (runtime errors) |
|
||||
| **Multi-tenant** | Native SurrealDB scopes | DIY isolation |
|
||||
| **AI** | Native in all products | Retrofitted |
|
||||
| **Self-hosted** | Complete | SaaS lock-in |
|
||||
| **Agents** | Learning-based, budget control | Static chains |
|
||||
|
||||
---
|
||||
|
||||
## 7. Financial Projection
|
||||
|
||||
### Conservative Scenario
|
||||
|
||||
#### Year 1: Establishment
|
||||
|
||||
| Source | Calculation | Revenue |
|
||||
|--------|---------|----------|
|
||||
| Enterprise (5 customers) | 5 × €50K avg | €250,000 |
|
||||
| Pro (50 customers) | 50 × €500/month × 12 | €300,000 |
|
||||
| Consulting | 200 days × €1,500 | €300,000 |
|
||||
| Training | 20 courses × €5K avg | €100,000 |
|
||||
| **TOTAL YEAR 1** | | **€950,000** |
|
||||
|
||||
#### Year 2: Growth
|
||||
|
||||
| Source | Calculation | Revenue |
|
||||
|--------|---------|----------|
|
||||
| Enterprise (15 customers) | 15 × €50K avg | €750,000 |
|
||||
| Pro (200 customers) | 200 × €500/month × 12 | €1,200,000 |
|
||||
| Consulting | 300 days × €1,500 | €450,000 |
|
||||
| Training + Certs | | €200,000 |
|
||||
| **TOTAL YEAR 2** | | **€2,600,000** |
|
||||
|
||||
#### Year 3: Scale
|
||||
|
||||
| Source | Calculation | Revenue |
|
||||
|--------|---------|----------|
|
||||
| Enterprise (40 customers) | 40 × €50K avg | €2,000,000 |
|
||||
| Pro (500 customers) | 500 × €500/month × 12 | €3,000,000 |
|
||||
| Professional services | | €800,000 |
|
||||
| Academy | | €400,000 |
|
||||
| **TOTAL YEAR 3** | | **€6,200,000** |
|
||||
|
||||
### Projection Summary
|
||||
|
||||
```text
|
||||
Year 1: €950K ████████░░░░░░░░░░░░░░░░░░░░░░
|
||||
Year 2: €2.6M ██████████████████████░░░░░░░░
|
||||
Year 3: €6.2M ██████████████████████████████████████████████████
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. Go-to-Market Plan
|
||||
|
||||
### Phase 1: Foundations (Months 1-3)
|
||||
|
||||
- [ ] Register stratumiops.dev / stratumiops.io domain
|
||||
- [ ] Create landing page with waitlist
|
||||
- [ ] Publish StratumIOps/knowledge (Kogral) as OSS
|
||||
- [ ] Write 5 technical blog posts
|
||||
- [ ] Create Discord channel
|
||||
|
||||
### Phase 2: Community (Months 4-6)
|
||||
|
||||
- [ ] Publish StratumIOps/orchestrate (Vapora) as OSS
|
||||
- [ ] Launch newsletter
|
||||
- [ ] Participate in 2 conferences
|
||||
- [ ] Reach 500 GitHub stars
|
||||
- [ ] First 10 active users
|
||||
|
||||
### Phase 3: Monetization (Months 7-12)
|
||||
|
||||
- [ ] Launch StratumIOps Pro
|
||||
- [ ] Close 3 Enterprise pilot customers
|
||||
- [ ] Launch StratumIOps Academy
|
||||
- [ ] Reach €500K ARR
|
||||
- [ ] Hire first Customer Success
|
||||
|
||||
---
|
||||
|
||||
## 9. Key Metrics (KPIs)
|
||||
|
||||
### Product
|
||||
|
||||
| Metric | Year 1 Target |
|
||||
|---------|--------------|
|
||||
| GitHub stars | 2,000 |
|
||||
| Monthly active users (free) | 500 |
|
||||
| Pro subscribers | 50 |
|
||||
| Enterprise customers | 5 |
|
||||
|
||||
### Revenue
|
||||
|
||||
| Metric | Year 1 Target |
|
||||
|---------|--------------|
|
||||
| ARR | €950K |
|
||||
| MRR growth | 15% month |
|
||||
| Net Revenue Retention | 110% |
|
||||
| CAC payback | < 12 months |
|
||||
|
||||
### Community
|
||||
|
||||
| Metric | Year 1 Target |
|
||||
|---------|--------------|
|
||||
| Discord members | 1,000 |
|
||||
| Newsletter subscribers | 3,000 |
|
||||
| Blog monthly visitors | 10,000 |
|
||||
| Conference talks | 5 |
|
||||
|
||||
---
|
||||
|
||||
## 10. Risks and Mitigation
|
||||
|
||||
| Risk | Probability | Impact | Mitigation |
|
||||
|--------|--------------|---------|------------|
|
||||
| Better-funded competitor | High | High | Technical differentiation (Rust), OSS community |
|
||||
| Slow Nickel adoption | Medium | Medium | Excellent documentation, migration paths |
|
||||
| LLM provider dependency | High | Medium | Multi-provider support, local Ollama |
|
||||
| Enterprise sales complexity | Medium | High | Initial mid-market focus, case studies |
|
||||
|
||||
---
|
||||
|
||||
## 11. Visual Identity (Proposal)
|
||||
|
||||
### Colors
|
||||
|
||||
| Color | Hex | Use |
|
||||
|-------|-----|-----|
|
||||
| **Primary** | `#6366F1` (Indigo) | Logo, CTAs, accents |
|
||||
| **Secondary** | `#22D3EE` (Cyan) | Highlights, gradients |
|
||||
| **Dark** | `#0F172A` (Slate 900) | Backgrounds, text |
|
||||
| **Light** | `#F8FAFC` (Slate 50) | Light backgrounds |
|
||||
|
||||
### Logo Concept
|
||||
|
||||
```text
|
||||
╔═══╗
|
||||
║ S ║ ← Stacked layers (stratum)
|
||||
╠═══╣
|
||||
║ O ║ ← Ops = gear/automation
|
||||
╚═══╝
|
||||
```
|
||||
|
||||
### Typography
|
||||
|
||||
| Use | Font |
|
||||
|-----|------|
|
||||
| **Headings** | Inter (bold, clean, tech) |
|
||||
| **Body** | Inter (regular) |
|
||||
| **Code** | JetBrains Mono |
|
||||
|
||||
---
|
||||
|
||||
*Document generated: 2026-01-22*
|
||||
*Updated: 2026-01-22 (STRATUMIOPS → StratumIOps)*
|
||||
*Type: info (brand and business strategy)*
|
||||
*Project: StratumIOps (portfolio name)*
|
||||
454
assets/en/stratumiops-branding-guide.md
Normal file
@ -0,0 +1,454 @@
|
||||
# StratumIOps: Branding Guide
|
||||
|
||||
## 1. Brand Identity
|
||||
|
||||
### Name
|
||||
|
||||
| Element | Value |
|
||||
|----------|-------|
|
||||
| **Full name** | StratumIOps |
|
||||
| **Pronunciation** | "Stratum-I-Ops" |
|
||||
| **Abbreviation** | SIO (internal use) |
|
||||
| **Domain** | stratumiops.dev |
|
||||
|
||||
### Meaning
|
||||
|
||||
```text
|
||||
STRATUMIOPS + I + Ops
|
||||
│ │ │
|
||||
│ │ └── Operations: automation, DevOps, workflows
|
||||
│ │
|
||||
│ └── Intelligence: AI, intelligent agents, decisions
|
||||
│
|
||||
└── Layers: architecture layers, full stack
|
||||
```
|
||||
|
||||
### Main Tagline
|
||||
|
||||
> **"Intelligent layers. Automated operations."**
|
||||
|
||||
### Alternative Taglines
|
||||
|
||||
| Context | Tagline |
|
||||
|----------|---------|
|
||||
| Technical | "Stack intelligence. Automate everything." |
|
||||
| Flow | "From knowledge to deployment. Automated." |
|
||||
| Benefits | "Build smarter. Deploy faster." |
|
||||
| Enterprise | "The full-stack operations platform." |
|
||||
|
||||
---
|
||||
|
||||
## 2. Logo
|
||||
|
||||
### Concept
|
||||
|
||||
The logo represents:
|
||||
- **Three horizontal layers**: Tiered architecture (Stratum)
|
||||
- **Bright central node**: Intelligence connecting the layers (I)
|
||||
- **Connection lines**: Data flow and operations (Ops)
|
||||
|
||||
### Available Versions
|
||||
|
||||
| File | Use |
|
||||
|---------|-----|
|
||||
| `stratumiops-logo.svg` | Primary, light background |
|
||||
| `stratumiops-logo-dark.svg` | Dark background with background |
|
||||
| `stratumiops-logo-minimal.svg` | Simplified version |
|
||||
| `stratumiops-logo-monochrome.svg` | Single color |
|
||||
| `stratumiops-logo-horizontal.svg` | With wordmark |
|
||||
|
||||
### Logo Construction
|
||||
|
||||
```text
|
||||
┌────────────────────────────────────────────────────────┐
|
||||
│ │
|
||||
│ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ← Layer 1 │
|
||||
│ │ │
|
||||
│ │ ← Connection │
|
||||
│ ▼ │
|
||||
│ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓●▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ← Layer 2 + Node │
|
||||
│ │ (cyan) │
|
||||
│ │ ← Connection │
|
||||
│ ▼ │
|
||||
│ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ← Layer 3 │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Clear Space
|
||||
|
||||
```text
|
||||
┌─────────────────────────────────────┐
|
||||
│ │
|
||||
│ ┌─┬───────────────────────┬─┐ │
|
||||
│ │ │ │ │ │
|
||||
│ │ │ ═══════════════ │ │ │
|
||||
│ │ │ ═══════●═══════ │ │ │
|
||||
│ │X│ ═══════════════ │X│ │ X = node height
|
||||
│ │ │ │ │ │
|
||||
│ └─┴───────────────────────┴─┘ │
|
||||
│ │
|
||||
└─────────────────────────────────────┘
|
||||
|
||||
Minimum space around logo = 1X (central node height)
|
||||
```
|
||||
|
||||
### Minimum Sizes
|
||||
|
||||
| Context | Minimum size |
|
||||
|----------|---------------|
|
||||
| Digital (screen) | 32px height |
|
||||
| Print | 12mm height |
|
||||
| Favicon | 16x16px (use simplified version) |
|
||||
|
||||
---
|
||||
|
||||
## 3. Color Palette
|
||||
|
||||
### Primary Colors
|
||||
|
||||
| Name | Hex | RGB | Use |
|
||||
|--------|-----|-----|-----|
|
||||
| **Indigo 500** | `#6366F1` | 99, 102, 241 | Primary logo, primary CTAs |
|
||||
| **Indigo 600** | `#4F46E5` | 79, 70, 229 | Hover states, dark variant |
|
||||
| **Indigo 400** | `#818CF8` | 129, 140, 248 | Light backgrounds, highlights |
|
||||
|
||||
### Secondary Colors (Accent)
|
||||
|
||||
| Name | Hex | RGB | Use |
|
||||
|--------|-----|-----|-----|
|
||||
| **Cyan 400** | `#22D3EE` | 34, 211, 238 | Intelligent node, accents |
|
||||
| **Cyan 500** | `#06B6D4` | 6, 182, 212 | Highlights, icons |
|
||||
| **Cyan 300** | `#67E8F9` | 103, 232, 249 | Glow effects |
|
||||
|
||||
### Neutral Colors
|
||||
|
||||
| Name | Hex | RGB | Use |
|
||||
|--------|-----|-----|-----|
|
||||
| **Slate 900** | `#0F172A` | 15, 23, 42 | Primary text, dark backgrounds |
|
||||
| **Slate 700** | `#334155` | 51, 65, 85 | Secondary text |
|
||||
| **Slate 400** | `#94A3B8` | 148, 163, 184 | Tertiary text, placeholders |
|
||||
| **Slate 200** | `#E2E8F0` | 226, 232, 240 | Borders, dividers |
|
||||
| **Slate 50** | `#F8FAFC` | 248, 250, 252 | Light backgrounds |
|
||||
|
||||
### Semantic Colors
|
||||
|
||||
| Name | Hex | Use |
|
||||
|--------|-----|-----|
|
||||
| **Success** | `#22C55E` | Confirmations, OK states |
|
||||
| **Warning** | `#F59E0B` | Alerts, cautions |
|
||||
| **Error** | `#EF4444` | Errors, critical states |
|
||||
| **Info** | `#3B82F6` | Information, tooltips |
|
||||
|
||||
### Gradients
|
||||
|
||||
```css
|
||||
/* Primary logo gradient */
|
||||
.gradient-primary {
|
||||
background: linear-gradient(135deg, #6366F1 0%, #4F46E5 100%);
|
||||
}
|
||||
|
||||
/* Intelligent node gradient */
|
||||
.gradient-node {
|
||||
background: radial-gradient(circle, #22D3EE 0%, #06B6D4 100%);
|
||||
}
|
||||
|
||||
/* Hero background gradient */
|
||||
.gradient-hero {
|
||||
background: linear-gradient(180deg, #0F172A 0%, #1E293B 100%);
|
||||
}
|
||||
|
||||
/* Accent gradient */
|
||||
.gradient-accent {
|
||||
background: linear-gradient(90deg, #6366F1 0%, #22D3EE 100%);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Typography
|
||||
|
||||
### Primary Font: Inter
|
||||
|
||||
| Weight | Use |
|
||||
|------|-----|
|
||||
| **Inter Bold (700)** | Headings, main titles |
|
||||
| **Inter SemiBold (600)** | Subtitles, emphasis |
|
||||
| **Inter Medium (500)** | Labels, navigation |
|
||||
| **Inter Regular (400)** | Body text |
|
||||
|
||||
### Code Font: JetBrains Mono
|
||||
|
||||
| Weight | Use |
|
||||
|------|-----|
|
||||
| **JetBrains Mono Regular** | Code, terminal, snippets |
|
||||
| **JetBrains Mono Bold** | Highlighted code |
|
||||
|
||||
### Typographic Scale
|
||||
|
||||
| Name | Size | Line Height | Use |
|
||||
|--------|--------|-------------|-----|
|
||||
| **Display** | 48px / 3rem | 1.1 | Hero headlines |
|
||||
| **H1** | 36px / 2.25rem | 1.2 | Page titles |
|
||||
| **H2** | 30px / 1.875rem | 1.25 | Main sections |
|
||||
| **H3** | 24px / 1.5rem | 1.3 | Subsections |
|
||||
| **H4** | 20px / 1.25rem | 1.4 | Cards, minor titles |
|
||||
| **Body Large** | 18px / 1.125rem | 1.6 | Lead text |
|
||||
| **Body** | 16px / 1rem | 1.6 | Main text |
|
||||
| **Body Small** | 14px / 0.875rem | 1.5 | Captions, metadata |
|
||||
| **Code** | 14px / 0.875rem | 1.6 | Inline code |
|
||||
|
||||
### CSS Variables
|
||||
|
||||
```css
|
||||
:root {
|
||||
/* Font families */
|
||||
--font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||
--font-mono: 'JetBrains Mono', 'Fira Code', monospace;
|
||||
|
||||
/* Font sizes */
|
||||
--text-xs: 0.75rem;
|
||||
--text-sm: 0.875rem;
|
||||
--text-base: 1rem;
|
||||
--text-lg: 1.125rem;
|
||||
--text-xl: 1.25rem;
|
||||
--text-2xl: 1.5rem;
|
||||
--text-3xl: 1.875rem;
|
||||
--text-4xl: 2.25rem;
|
||||
--text-5xl: 3rem;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Iconography
|
||||
|
||||
### Style
|
||||
|
||||
- **Type**: Outline icons (line, not filled)
|
||||
- **Stroke width**: 1.5px - 2px
|
||||
- **Corner radius**: Consistent with logo (rounded)
|
||||
- **Base size**: 24x24px
|
||||
- **Recommended set**: Lucide Icons, Heroicons (outline)
|
||||
|
||||
### Product Icons
|
||||
|
||||
| Product | Suggested Icon |
|
||||
|----------|----------------|
|
||||
| StratumIOps/knowledge | `book-open` + `brain` |
|
||||
| StratumIOps/orchestrate | `workflow` + `bot` |
|
||||
| StratumIOps/interact | `form-input` + `terminal` |
|
||||
| StratumIOps/provision | `server` + `cloud` |
|
||||
|
||||
---
|
||||
|
||||
## 6. UI Components
|
||||
|
||||
### Buttons
|
||||
|
||||
```css
|
||||
/* Primary */
|
||||
.btn-primary {
|
||||
background: linear-gradient(135deg, #6366F1 0%, #4F46E5 100%);
|
||||
color: white;
|
||||
border-radius: 8px;
|
||||
padding: 12px 24px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background: linear-gradient(135deg, #4F46E5 0%, #4338CA 100%);
|
||||
}
|
||||
|
||||
/* Secondary */
|
||||
.btn-secondary {
|
||||
background: transparent;
|
||||
color: #6366F1;
|
||||
border: 2px solid #6366F1;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
/* Ghost */
|
||||
.btn-ghost {
|
||||
background: transparent;
|
||||
color: #6366F1;
|
||||
}
|
||||
```
|
||||
|
||||
### Cards
|
||||
|
||||
```css
|
||||
.card {
|
||||
background: white;
|
||||
border-radius: 12px;
|
||||
border: 1px solid #E2E8F0;
|
||||
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.card-dark {
|
||||
background: #1E293B;
|
||||
border: 1px solid #334155;
|
||||
}
|
||||
```
|
||||
|
||||
### Inputs
|
||||
|
||||
```css
|
||||
.input {
|
||||
border: 1px solid #E2E8F0;
|
||||
border-radius: 8px;
|
||||
padding: 12px 16px;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.input:focus {
|
||||
border-color: #6366F1;
|
||||
box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. Applications
|
||||
|
||||
### Website
|
||||
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ [Logo] Products Pricing Docs Blog [Sign In] │
|
||||
├─────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ StratumIOps │
|
||||
│ │
|
||||
│ Intelligent layers. │
|
||||
│ Automated operations. │
|
||||
│ │
|
||||
│ [Get Started] [View Demo] │
|
||||
│ │
|
||||
├─────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
|
||||
│ │Knowledge│ │Orchestr.│ │ Interact│ │Provision│ │
|
||||
│ │ ════ │ │ ════ │ │ ════ │ │ ════ │ │
|
||||
│ │ ═●═ │ │ ═●═ │ │ ═●═ │ │ ═●═ │ │
|
||||
│ │ ════ │ │ ════ │ │ ════ │ │ ════ │ │
|
||||
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Documentation
|
||||
|
||||
- Background: Slate 50 (#F8FAFC)
|
||||
- Sidebar: White with Slate 200 border
|
||||
- Code blocks: Slate 900 with syntax highlighting
|
||||
- Headers: Indigo 600
|
||||
|
||||
### Presentations
|
||||
|
||||
- Dark template: Slate 900 background, white text
|
||||
- Light template: White background, Slate 900 text
|
||||
- Accent on all slides: Cyan for highlights
|
||||
|
||||
---
|
||||
|
||||
## 8. Incorrect Usage
|
||||
|
||||
### Don't Do This
|
||||
|
||||
```text
|
||||
❌ Change logo colors
|
||||
❌ Rotate the logo
|
||||
❌ Add effects (shadows, extra outlines)
|
||||
❌ Stretch or compress disproportionately
|
||||
❌ Use on backgrounds that reduce contrast
|
||||
❌ Separate the node from the layers
|
||||
❌ Change wordmark typography
|
||||
❌ Use full version when space is very small
|
||||
```
|
||||
|
||||
### Allowed Backgrounds
|
||||
|
||||
| Background | Logo Version |
|
||||
|-------|------------------|
|
||||
| White / Light | Primary logo (colors) |
|
||||
| Slate 900 / Black | Dark version logo |
|
||||
| Indigo (brand color) | White monochromatic logo |
|
||||
| Photographs | Only if sufficient contrast |
|
||||
|
||||
---
|
||||
|
||||
## 9. Voice and Tone
|
||||
|
||||
### Brand Personality
|
||||
|
||||
| Attribute | Description |
|
||||
|----------|-------------|
|
||||
| **Intelligent** | We know the space, we speak with technical authority |
|
||||
| **Direct** | No beating around the bush, straight to the point |
|
||||
| **Accessible** | Technical but not intimidating |
|
||||
| **Reliable** | Enterprise-ready, serious, professional |
|
||||
| **Innovative** | Rust, Nickel, native AI - we're ahead |
|
||||
|
||||
### Copy Examples
|
||||
|
||||
**Yes**:
|
||||
- "Deploy infrastructure with type-safe confidence."
|
||||
- "Your agents learn. Your costs drop."
|
||||
- "Knowledge that your AI actually uses."
|
||||
|
||||
**No**:
|
||||
- "Revolutionary AI-powered paradigm shift!" (hype)
|
||||
- "Super easy to use!" (vague)
|
||||
- "The best platform ever!" (empty superlatives)
|
||||
|
||||
---
|
||||
|
||||
## 10. Digital Assets
|
||||
|
||||
### Logo Files
|
||||
|
||||
```
|
||||
.coder/
|
||||
├── 2026-01-22-stratumiops-logo.svg # Primary
|
||||
├── 2026-01-22-stratumiops-logo-dark.svg # Dark background
|
||||
├── 2026-01-22-stratumiops-logo-minimal.svg # Simplified
|
||||
├── 2026-01-22-stratumiops-logo-monochrome.svg # Single color
|
||||
└── 2026-01-22-stratumiops-logo-horizontal.svg # With wordmark
|
||||
```
|
||||
|
||||
### Required Exports
|
||||
|
||||
```
|
||||
/brand/
|
||||
├── logo/
|
||||
│ ├── svg/ # All SVGs
|
||||
│ ├── png/ # 64, 128, 256, 512, 1024px
|
||||
│ ├── favicon/ # ico, png 16/32/48
|
||||
│ └── social/ # Open Graph, Twitter cards
|
||||
├── colors/
|
||||
│ └── palette.css # CSS variables
|
||||
├── fonts/
|
||||
│ └── README.md # Links to Inter and JetBrains Mono
|
||||
└── templates/
|
||||
├── presentation/ # Slide templates
|
||||
└── documents/ # Letterhead, etc.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 11. Contact and Resources
|
||||
|
||||
| Resource | URL |
|
||||
|---------|-----|
|
||||
| Website | stratumiops.dev |
|
||||
| Docs | docs.stratumiops.dev |
|
||||
| GitHub | github.com/stratumiops |
|
||||
| Twitter/X | @stratumiops |
|
||||
| Discord | discord.gg/stratumiops |
|
||||
|
||||
---
|
||||
|
||||
*Branding Guide v1.0*
|
||||
*Document generated: 2026-01-22*
|
||||
*Project: StratumIOps*
|
||||
220
assets/en/stratumiops-logo-prompts.md
Normal file
@ -0,0 +1,220 @@
|
||||
# StratumIOps: Logo Generation Prompts
|
||||
|
||||
## Logo Concept
|
||||
|
||||
| Element | Visual Meaning |
|
||||
|----------|-------------------|
|
||||
| **Stratum** | Stacked layers, geological strata, tiered architecture |
|
||||
| **I** | Intelligence, central node, neural connection |
|
||||
| **Ops** | Gears, flow, automation, continuous cycle |
|
||||
|
||||
---
|
||||
|
||||
## AI Prompts (Midjourney/DALL-E/Ideogram)
|
||||
|
||||
### Main Prompt (Abstract Geometric)
|
||||
|
||||
```
|
||||
A modern minimalist tech logo for "StratumIOps", featuring three horizontal
|
||||
stacked layers with a glowing neural node in the center representing
|
||||
intelligence. Clean geometric design with subtle gradient from indigo (#6366F1)
|
||||
to cyan (#22D3EE). The layers suggest depth and architecture. Professional
|
||||
SaaS company aesthetic. Vector style, scalable, works on dark and light
|
||||
backgrounds. No text in the logo mark.
|
||||
```
|
||||
|
||||
### Variant 1 (Layers + Circuit)
|
||||
|
||||
```
|
||||
Minimalist logo icon: three horizontal parallel lines stacked vertically
|
||||
representing layers/strata, with a small glowing circuit node connecting
|
||||
them in the center. Color palette: indigo to cyan gradient. Tech startup
|
||||
aesthetic, clean lines, geometric precision. Silicon Valley style.
|
||||
Suitable for app icon and favicon. Vector art, flat design with subtle
|
||||
depth. Dark background version.
|
||||
```
|
||||
|
||||
### Variant 2 (Hexagonal)
|
||||
|
||||
```
|
||||
Hexagonal tech logo with three internal horizontal divisions representing
|
||||
layers. A bright intelligent core at the center. Modern DevOps platform
|
||||
branding. Colors: deep indigo (#4F46E5) transitioning to electric cyan
|
||||
(#06B6D4). Minimalist, professional, suitable for enterprise software.
|
||||
Clean vector style, no gradients on the shape, gradient only on accent.
|
||||
```
|
||||
|
||||
### Variant 3 (Isometric)
|
||||
|
||||
```
|
||||
Isometric 3D logo showing three stacked platform layers with a glowing
|
||||
intelligence core. Modern cloud infrastructure aesthetic. Clean geometric
|
||||
shapes, professional tech company style. Primary color indigo with cyan
|
||||
accent highlights. Suitable for both light and dark modes. Minimal,
|
||||
sophisticated, enterprise-ready design.
|
||||
```
|
||||
|
||||
### Variant 4 (Stylized S)
|
||||
|
||||
```
|
||||
Stylized letter "S" logo made of three horizontal stacked segments
|
||||
representing layers/strata. A small glowing dot in the center segment
|
||||
representing the "I" of intelligence. Modern tech company aesthetic.
|
||||
Indigo (#6366F1) as primary color with cyan (#22D3EE) accent on the
|
||||
intelligence node. Clean, minimal, vector style. Works as app icon.
|
||||
```
|
||||
|
||||
### Variant 5 (Data Flow)
|
||||
|
||||
```
|
||||
Abstract logo showing data flowing through three horizontal layers,
|
||||
with a central processing node glowing with intelligence. Represents
|
||||
automated operations across architectural layers. Tech platform aesthetic.
|
||||
Indigo to cyan color scheme. Minimalist, professional, suitable for
|
||||
developer tools company. Vector art, clean lines.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Prompts for Specific Versions
|
||||
|
||||
### App Icon / Favicon
|
||||
|
||||
```
|
||||
Square app icon design: simplified three-layer stack with glowing center
|
||||
node. Must be recognizable at 16x16 pixels. High contrast, indigo
|
||||
background with cyan/white accent. Minimal detail, bold shapes.
|
||||
Tech platform favicon style.
|
||||
```
|
||||
|
||||
### Monochrome Version
|
||||
|
||||
```
|
||||
Single color logo version: three stacked horizontal bars with center
|
||||
connection point. Works in pure white, pure black, or single brand color.
|
||||
No gradients, pure vector shapes. Suitable for watermarks, embossing,
|
||||
single-color printing.
|
||||
```
|
||||
|
||||
### Horizontal Version (with Wordmark)
|
||||
|
||||
```
|
||||
Horizontal logo lockup: geometric icon of three stacked layers with
|
||||
intelligent core on the left, "StratumIOps" wordmark on the right in
|
||||
clean sans-serif font (Inter or similar). Professional tech company
|
||||
style. Indigo primary with cyan accent. Balanced spacing.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Technical Specifications for Designer
|
||||
|
||||
### Base Dimensions
|
||||
|
||||
| Use | Size | Format |
|
||||
|-----|--------|---------|
|
||||
| Logo mark (icon) | 512x512 px | SVG, PNG |
|
||||
| Favicon | 32x32, 16x16 px | ICO, PNG |
|
||||
| App icon | 1024x1024 px | PNG |
|
||||
| Social media | 400x400 px | PNG |
|
||||
| Horizontal lockup | 1200x300 px | SVG, PNG |
|
||||
|
||||
### Colors to Specify
|
||||
|
||||
| Color | Hex | RGB | Use |
|
||||
|-------|-----|-----|-----|
|
||||
| Primary Indigo | `#6366F1` | 99, 102, 241 | Primary logo |
|
||||
| Deep Indigo | `#4F46E5` | 79, 70, 229 | Dark variant |
|
||||
| Cyan Accent | `#22D3EE` | 34, 211, 238 | Intelligent node |
|
||||
| Electric Cyan | `#06B6D4` | 6, 182, 212 | Highlights |
|
||||
| Dark Background | `#0F172A` | 15, 23, 42 | Dark background |
|
||||
| Light Background | `#F8FAFC` | 248, 250, 252 | Light background |
|
||||
|
||||
### Delivery Requirements
|
||||
|
||||
```
|
||||
□ Logo mark SVG (scalable vector)
|
||||
□ Logo mark PNG (512px, 1024px, 2048px)
|
||||
□ Favicon ICO (16px, 32px, 48px)
|
||||
□ App icon PNG (1024px with rounded corners)
|
||||
□ Horizontal lockup SVG
|
||||
□ Horizontal lockup PNG (multiple sizes)
|
||||
□ Monochrome version (white, black)
|
||||
□ Dark background version
|
||||
□ Light background version
|
||||
□ Editable source file (Figma/AI/Sketch)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Visual Reference Concepts
|
||||
|
||||
### Mood Board Keywords
|
||||
|
||||
```
|
||||
- Layered architecture
|
||||
- Neural network node
|
||||
- Cloud infrastructure
|
||||
- DevOps pipeline
|
||||
- Data flow visualization
|
||||
- Geometric minimalism
|
||||
- Enterprise SaaS
|
||||
- Developer tools
|
||||
- Platform engineering
|
||||
- Intelligent automation
|
||||
```
|
||||
|
||||
### Reference Logos (Similar Style)
|
||||
|
||||
- **Vercel** - Geometric simplicity, triangle
|
||||
- **Linear** - Minimalism, clean lines
|
||||
- **Supabase** - Subtle gradients, tech feel
|
||||
- **Prisma** - Geometric shapes, depth
|
||||
- **Planetscale** - Layers, movement
|
||||
- **Railway** - Simple, memorable, tech
|
||||
|
||||
---
|
||||
|
||||
## ASCII Concept Examples
|
||||
|
||||
### Concept 1: Layers with Central Node
|
||||
|
||||
```
|
||||
════════════════
|
||||
════════●═══════ ← Intelligent node (cyan)
|
||||
════════════════
|
||||
```
|
||||
|
||||
### Concept 2: Stylized S
|
||||
|
||||
```
|
||||
╔═══════════╗
|
||||
╠═════●═════╣ ← I of Intelligence
|
||||
╚═══════════╝
|
||||
```
|
||||
|
||||
### Concept 3: Hexagonal
|
||||
|
||||
```
|
||||
╱────────╲
|
||||
╱──────────╲
|
||||
│ ● │ ← Intelligent core
|
||||
╲──────────╱
|
||||
╲────────╱
|
||||
```
|
||||
|
||||
### Concept 4: Isometric
|
||||
|
||||
```
|
||||
▁▁▁▁▁▁▁
|
||||
╱ ╲
|
||||
▕ ● ▏ ← Node
|
||||
╲_______╱
|
||||
▔▔▔▔▔▔▔
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
*Document generated: 2026-01-22*
|
||||
*Project: StratumIOps*
|
||||
*Use: AI logo generation or designer brief*
|
||||
476
assets/es/stratumiops-brand-strategy.md
Normal file
@ -0,0 +1,476 @@
|
||||
# StratumIOps: Estrategia de Marca y Modelo de Negocio
|
||||
|
||||
## Resumen Ejecutivo
|
||||
|
||||
| Aspecto | Decisión |
|
||||
|---------|----------|
|
||||
| **Nombre** | StratumIOps |
|
||||
| **Pronunciación** | "Stratum-I-Ops" |
|
||||
| **Eslogan** | "Intelligent layers. Automated operations." |
|
||||
| **Modelo** | Open Core + Enterprise + Services |
|
||||
| **Target** | Mid-market tech companies (50-500 devs) |
|
||||
| **Diferenciador** | Único platform integrado Rust-native con IA |
|
||||
| **Dominio** | stratumiops.dev
|
||||
|
||||
---
|
||||
|
||||
## 1. Nombre y Branding
|
||||
|
||||
### Nombre Seleccionado: StratumIOps
|
||||
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ │
|
||||
│ ███████╗████████╗██████╗ █████╗ ████████╗██╗ ██╗███╗ ███╗
|
||||
│ ██╔════╝╚══██╔══╝██╔══██╗██╔══██╗╚══██╔══╝██║ ██║████╗ ████║
|
||||
│ ███████╗ ██║ ██████╔╝███████║ ██║ ██║ ██║██╔████╔██║
|
||||
│ ╚════██║ ██║ ██╔══██╗██╔══██║ ██║ ██║ ██║██║╚██╔╝██║
|
||||
│ ███████║ ██║ ██║ ██║██║ ██║ ██║ ╚██████╔╝██║ ╚═╝ ██║
|
||||
│ ╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝
|
||||
│ ██████╗ ██████╗ ███████╗
|
||||
│ ██╔═══██╗██╔══██╗██╔════╝
|
||||
│ ██║ ██║██████╔╝███████╗
|
||||
│ ██║ ██║██╔═══╝ ╚════██║
|
||||
│ ╚██████╔╝██║ ███████║
|
||||
│ ╚═════╝ ╚═╝ ╚══════╝
|
||||
│ │
|
||||
│ "Intelligent layers. Automated operations." │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Justificación
|
||||
|
||||
| Criterio | Evaluación |
|
||||
|----------|------------|
|
||||
| **Tech-feel** | Sufijo "-Ops" inmediatamente tecnológico (GitOps, DevOps, MLOps, AIOps) |
|
||||
| **Metáfora** | "Stratum" = capas. Cada proyecto es una capa del stack |
|
||||
| **Market fit** | Conecta con Platform Engineering / DevOps market |
|
||||
| **Escalabilidad** | Permite añadir más "capas" en el futuro |
|
||||
| **Bilingüe** | Funciona igual en inglés y español |
|
||||
| **Disponibilidad** | stratumiops.dev / stratumiops.io probablemente disponibles |
|
||||
| **Diferenciación** | No hay competidores directos con ese nombre |
|
||||
| **Memorable** | Fácil de recordar, no muy largo |
|
||||
|
||||
### Alternativas Consideradas
|
||||
|
||||
| Nombre | Concepto | Razón de Descarte |
|
||||
|--------|----------|-------------------|
|
||||
| STRATUMIOPS (solo) | Capas geológicas | Falta tech-feel, stratum.dev no disponible |
|
||||
| NEXUS | Punto de conexión | Muy usado en tech |
|
||||
| Layerix | Layers + suffix tech | Inventado, menos reconocible |
|
||||
| Forgelayer | Forge + layers | Más largo, menos memorable |
|
||||
| DevSTRATUMIOPS | Dev + layers | Suena genérico |
|
||||
|
||||
---
|
||||
|
||||
## 2. Arquitectura de Marca
|
||||
|
||||
### Jerarquía de Productos
|
||||
|
||||
```text
|
||||
StratumIOps
|
||||
"Intelligent layers.
|
||||
Automated operations."
|
||||
│
|
||||
┌────────────────┼────────────────┐
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
┌──────────┐ ┌──────────┐ ┌────────────┐
|
||||
│StratumIOps│ │StratumIOps│ │ StratumIOps │
|
||||
│ Core │ │ Pro │ │ Enterprise │
|
||||
│ (OSS) │ │(License) │ │ (Support) │
|
||||
└──────────┘ └──────────┘ └────────────┘
|
||||
```
|
||||
|
||||
### Productos Bajo el Paraguas
|
||||
|
||||
| Producto | Origen | Nombre Público | Tagline |
|
||||
|----------|--------|----------------|---------|
|
||||
| Kogral | Knowledge Graph | StratumIOps/knowledge | "Capture and query team knowledge" |
|
||||
| Vapora | Orchestration | StratumIOps/orchestrate | "Coordinate agents and workflows" |
|
||||
| TypeDialog | Forms/Automation | StratumIOps/interact | "Universal forms and automation" |
|
||||
| Provisioning | Infrastructure | StratumIOps/provision | "Infrastructure as typed code" |
|
||||
|
||||
### Visualización
|
||||
|
||||
```text
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ StratumIOps/knowledge ←── Kogral │
|
||||
│ "Capture and query team knowledge" │
|
||||
├──────────────────────────────────────────────────────────────┤
|
||||
│ StratumIOps/orchestrate ←── Vapora │
|
||||
│ "Coordinate agents and development workflows" │
|
||||
├──────────────────────────────────────────────────────────────┤
|
||||
│ StratumIOps/interact ←── TypeDialog │
|
||||
│ "Universal forms and automation" │
|
||||
├──────────────────────────────────────────────────────────────┤
|
||||
│ StratumIOps/provision ←── Provisioning │
|
||||
│ "Infrastructure as typed code" │
|
||||
└──────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Eslóganes
|
||||
|
||||
### Principal
|
||||
|
||||
> **"Intelligent layers. Automated operations."**
|
||||
|
||||
### Variantes por Contexto
|
||||
|
||||
| Contexto | Eslogan | Uso |
|
||||
|----------|---------|-----|
|
||||
| **Principal** | "Intelligent layers. Automated operations." | Branding general |
|
||||
| **Técnico** | "Stack intelligence. Automate everything." | Developer marketing |
|
||||
| **Flujo** | "From knowledge to deployment. Automated." | Presentaciones |
|
||||
| **Beneficios** | "Build smarter. Deploy faster." | Marketing, ads |
|
||||
| **Enterprise** | "The full-stack operations platform" | Ventas B2B |
|
||||
| **Pain point** | "Development without friction" | Landing pages |
|
||||
| **Kogral-centric** | "Where your team's knowledge becomes code" | Content marketing |
|
||||
|
||||
### Mensaje Clave para Ventas
|
||||
|
||||
> "StratumIOps es la única plataforma que unifica knowledge management, agent orchestration, universal forms, y infrastructure-as-code en un stack coherente de Rust. No más 10 herramientas desconectadas. No más conocimiento perdido. No más costos LLM descontrolados. Un ecosistema. Integración real."
|
||||
|
||||
---
|
||||
|
||||
## 4. Modelo de Negocio
|
||||
|
||||
### 4.1 Open Core + Enterprise
|
||||
|
||||
#### Tier FREE (Open Source)
|
||||
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ StratumIOps FREE (OSS) │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ • Kogral core (knowledge graph, CLI, MCP) │
|
||||
│ • Vapora community (agents, basic routing) │
|
||||
│ • TypeDialog core (6 backends, forms) │
|
||||
│ • Provisioning community (AWS, basic orchestration) │
|
||||
│ • Single-tenant, self-hosted │
|
||||
│ • Community support (GitHub Issues) │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
#### Tier PRO (Licencia)
|
||||
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ StratumIOps PRO ($X/user/month) │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ Todo de Free + │
|
||||
│ • Multi-tenant con SurrealDB scopes │
|
||||
│ • Budget enforcement avanzado (alertas, dashboards) │
|
||||
│ • Todos los cloud providers (GCP, Azure, Hetzner, UpCloud) │
|
||||
│ • SSO (SAML, OIDC) │
|
||||
│ • Priority support (48h SLA) │
|
||||
│ • Actualizaciones automáticas │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
#### Tier ENTERPRISE (Custom)
|
||||
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ StratumIOps ENTERPRISE (Custom pricing) │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ Todo de Pro + │
|
||||
│ • Security layer completo (39K líneas) │
|
||||
│ • Audit logging (7 años, 5 formatos export) │
|
||||
│ • MFA avanzado (WebAuthn/FIDO2) │
|
||||
│ • 5 KMS backends │
|
||||
│ • Cedar policies custom │
|
||||
│ • Break-glass multi-party │
|
||||
│ • Compliance packs (SOC2, HIPAA, GDPR) │
|
||||
│ • Dedicated support (4h SLA) │
|
||||
│ • Custom integrations │
|
||||
│ • On-premise deployment assistance │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 4.2 Servicios Profesionales
|
||||
|
||||
#### Implementación
|
||||
|
||||
| Servicio | Duración | Tarifa Referencia |
|
||||
|----------|----------|-------------------|
|
||||
| Assessment inicial | 1-2 días | €2,000 - €4,000 |
|
||||
| Implementación básica | 1 semana | €8,000 - €15,000 |
|
||||
| Implementación enterprise | 1 mes | €30,000 - €60,000 |
|
||||
| Migración desde otras tools | Variable | Custom |
|
||||
|
||||
#### Consultoría
|
||||
|
||||
| Especialidad | Tarifa/Día |
|
||||
|--------------|------------|
|
||||
| Arquitectura de agentes IA | €1,500 |
|
||||
| Knowledge management strategy | €1,500 |
|
||||
| IaC modernization (Nickel) | €1,500 |
|
||||
| Security audit | €2,000 |
|
||||
|
||||
#### Soporte Premium
|
||||
|
||||
| Modalidad | Tarifa Mensual |
|
||||
|-----------|----------------|
|
||||
| Dedicated engineer | €5,000 - €10,000 |
|
||||
| On-call support 24/7 | €3,000 adicional |
|
||||
| Quarterly business reviews | Incluido en Enterprise |
|
||||
|
||||
### 4.3 Training y Certificación
|
||||
|
||||
#### StratumIOps Academy - Cursos
|
||||
|
||||
| Curso | Formato | Precio |
|
||||
|-------|---------|--------|
|
||||
| StratumIOps Fundamentals | Online, self-paced | €500 |
|
||||
| StratumIOps for DevOps | 2 días, presencial | €1,200 |
|
||||
| AI Agent Development con Vapora | 3 días | €1,800 |
|
||||
| Nickel IaC Masterclass | 2 días | €1,200 |
|
||||
| Enterprise Security Workshop | 1 día | €800 |
|
||||
|
||||
#### Certificaciones
|
||||
|
||||
| Certificación | Examen |
|
||||
|---------------|--------|
|
||||
| StratumIOps Certified Developer (SOCD) | €300 |
|
||||
| StratumIOps Certified Architect (SOCA) | €500 |
|
||||
| StratumIOps Certified Administrator (SOCAD) | €400 |
|
||||
|
||||
#### Corporate Training
|
||||
|
||||
| Modalidad | Precio |
|
||||
|-----------|--------|
|
||||
| Team training (hasta 10 personas) | €8,000/día |
|
||||
|
||||
---
|
||||
|
||||
## 5. Estrategia de Reputación
|
||||
|
||||
### 5.1 Thought Leadership
|
||||
|
||||
| Canal | Contenido |
|
||||
|-------|-----------|
|
||||
| **Blog técnico** (stratumiops.dev/blog) | Deep dives arquitectura Rust, comparativas vs Terraform/LangChain, case studies |
|
||||
| **YouTube** | Demos de productos, tutoriales técnicos, conference talks |
|
||||
| **Newsletter** | Release notes, industry insights, tips & tricks |
|
||||
| **GitHub** | OSS contributions, example repos, community engagement |
|
||||
|
||||
### 5.2 Community Building
|
||||
|
||||
| Iniciativa | Propósito |
|
||||
|------------|-----------|
|
||||
| Discord/Slack community | Soporte peer-to-peer, feedback |
|
||||
| GitHub Discussions | Q&A técnico, RFCs públicos |
|
||||
| Meetups virtuales (mensuales) | Demos, AMA sessions |
|
||||
| Conference presence | RustConf, KubeCon, local meetups |
|
||||
| Open source contributions | Plugins, integrations, examples |
|
||||
|
||||
### 5.3 Credibilidad Técnica
|
||||
|
||||
**Diferenciadores para comunicar**:
|
||||
|
||||
| Métrica | Mensaje |
|
||||
|---------|---------|
|
||||
| 195K líneas de Rust | Performance y type-safety |
|
||||
| 4,310+ tests | Calidad y confiabilidad |
|
||||
| 39K líneas de seguridad | Enterprise-ready |
|
||||
| Zero unsafe code | Security by design |
|
||||
| 100% documented APIs | Developer experience |
|
||||
| Full stack Rust | Consistencia tecnológica |
|
||||
|
||||
---
|
||||
|
||||
## 6. Posicionamiento Competitivo
|
||||
|
||||
### Mapa de Posicionamiento
|
||||
|
||||
```text
|
||||
ENTERPRISE FEATURES
|
||||
▲
|
||||
│
|
||||
Terraform/Pulumi │ ┌───────────┐
|
||||
● │ │StratumIOps │
|
||||
│ │ (aquí) │
|
||||
│ └───────────┘
|
||||
│
|
||||
───────────────────────┼───────────────────────▶
|
||||
SINGLE TOOL │ INTEGRATED PLATFORM
|
||||
│
|
||||
LangChain ● │
|
||||
│
|
||||
Notion ● │ ● Obsidian
|
||||
│
|
||||
│
|
||||
▼
|
||||
BASIC FEATURES
|
||||
```
|
||||
|
||||
### Mensaje de Posicionamiento
|
||||
|
||||
> "El único platform que integra knowledge management, agent orchestration, forms automation, y IaC en un stack coherente de Rust."
|
||||
|
||||
### Comparativa con Alternativas
|
||||
|
||||
| Aspecto | StratumIOps | Competencia |
|
||||
|---------|------------|-------------|
|
||||
| **Stack** | Rust end-to-end | Python/JS/Go mix |
|
||||
| **Config** | Nickel (typed) | YAML/JSON (runtime errors) |
|
||||
| **Multi-tenant** | SurrealDB scopes nativo | DIY isolation |
|
||||
| **IA** | Nativa en todos los productos | Retrofitted |
|
||||
| **Self-hosted** | Completo | SaaS lock-in |
|
||||
| **Agentes** | Learning-based, budget control | Chains estáticos |
|
||||
|
||||
---
|
||||
|
||||
## 7. Proyección Financiera
|
||||
|
||||
### Escenario Conservador
|
||||
|
||||
#### Año 1: Establecimiento
|
||||
|
||||
| Fuente | Cálculo | Ingresos |
|
||||
|--------|---------|----------|
|
||||
| Enterprise (5 clientes) | 5 × €50K avg | €250,000 |
|
||||
| Pro (50 clientes) | 50 × €500/mes × 12 | €300,000 |
|
||||
| Consultoría | 200 días × €1,500 | €300,000 |
|
||||
| Training | 20 cursos × €5K avg | €100,000 |
|
||||
| **TOTAL AÑO 1** | | **€950,000** |
|
||||
|
||||
#### Año 2: Crecimiento
|
||||
|
||||
| Fuente | Cálculo | Ingresos |
|
||||
|--------|---------|----------|
|
||||
| Enterprise (15 clientes) | 15 × €50K avg | €750,000 |
|
||||
| Pro (200 clientes) | 200 × €500/mes × 12 | €1,200,000 |
|
||||
| Consultoría | 300 días × €1,500 | €450,000 |
|
||||
| Training + Certs | | €200,000 |
|
||||
| **TOTAL AÑO 2** | | **€2,600,000** |
|
||||
|
||||
#### Año 3: Escala
|
||||
|
||||
| Fuente | Cálculo | Ingresos |
|
||||
|--------|---------|----------|
|
||||
| Enterprise (40 clientes) | 40 × €50K avg | €2,000,000 |
|
||||
| Pro (500 clientes) | 500 × €500/mes × 12 | €3,000,000 |
|
||||
| Servicios profesionales | | €800,000 |
|
||||
| Academy | | €400,000 |
|
||||
| **TOTAL AÑO 3** | | **€6,200,000** |
|
||||
|
||||
### Resumen Proyección
|
||||
|
||||
```text
|
||||
Año 1: €950K ████████░░░░░░░░░░░░░░░░░░░░░░
|
||||
Año 2: €2.6M ██████████████████████░░░░░░░░
|
||||
Año 3: €6.2M ██████████████████████████████████████████████████
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. Plan de Go-to-Market
|
||||
|
||||
### Fase 1: Foundations (Meses 1-3)
|
||||
|
||||
- [ ] Registrar dominio stratumiops.dev / stratumiops.io
|
||||
- [ ] Crear landing page con waitlist
|
||||
- [ ] Publicar StratumIOps/knowledge (Kogral) como OSS
|
||||
- [ ] Escribir 5 blog posts técnicos
|
||||
- [ ] Crear canal Discord
|
||||
|
||||
### Fase 2: Community (Meses 4-6)
|
||||
|
||||
- [ ] Publicar StratumIOps/orchestrate (Vapora) como OSS
|
||||
- [ ] Lanzar newsletter
|
||||
- [ ] Participar en 2 conferencias
|
||||
- [ ] Alcanzar 500 estrellas GitHub
|
||||
- [ ] Primeros 10 usuarios activos
|
||||
|
||||
### Fase 3: Monetization (Meses 7-12)
|
||||
|
||||
- [ ] Lanzar StratumIOps Pro
|
||||
- [ ] Cerrar 3 clientes Enterprise pilot
|
||||
- [ ] Lanzar StratumIOps Academy
|
||||
- [ ] Alcanzar €500K ARR
|
||||
- [ ] Contratar primer Customer Success
|
||||
|
||||
---
|
||||
|
||||
## 9. Métricas Clave (KPIs)
|
||||
|
||||
### Product
|
||||
|
||||
| Métrica | Target Año 1 |
|
||||
|---------|--------------|
|
||||
| GitHub stars | 2,000 |
|
||||
| Monthly active users (free) | 500 |
|
||||
| Pro subscribers | 50 |
|
||||
| Enterprise customers | 5 |
|
||||
|
||||
### Revenue
|
||||
|
||||
| Métrica | Target Año 1 |
|
||||
|---------|--------------|
|
||||
| ARR | €950K |
|
||||
| MRR growth | 15% mes |
|
||||
| Net Revenue Retention | 110% |
|
||||
| CAC payback | < 12 meses |
|
||||
|
||||
### Community
|
||||
|
||||
| Métrica | Target Año 1 |
|
||||
|---------|--------------|
|
||||
| Discord members | 1,000 |
|
||||
| Newsletter subscribers | 3,000 |
|
||||
| Blog monthly visitors | 10,000 |
|
||||
| Conference talks | 5 |
|
||||
|
||||
---
|
||||
|
||||
## 10. Riesgos y Mitigación
|
||||
|
||||
| Riesgo | Probabilidad | Impacto | Mitigación |
|
||||
|--------|--------------|---------|------------|
|
||||
| Competidor con más recursos | Alta | Alto | Diferenciación técnica (Rust), comunidad OSS |
|
||||
| Adopción lenta de Nickel | Media | Medio | Documentación excelente, migration paths |
|
||||
| Dependencia de LLM providers | Alta | Medio | Soporte multi-provider, Ollama local |
|
||||
| Complejidad de venta enterprise | Media | Alto | Focus inicial en mid-market, case studies |
|
||||
|
||||
---
|
||||
|
||||
## 11. Identidad Visual (Propuesta)
|
||||
|
||||
### Colores
|
||||
|
||||
| Color | Hex | Uso |
|
||||
|-------|-----|-----|
|
||||
| **Primary** | `#6366F1` (Indigo) | Logo, CTAs, accents |
|
||||
| **Secondary** | `#22D3EE` (Cyan) | Highlights, gradients |
|
||||
| **Dark** | `#0F172A` (Slate 900) | Backgrounds, text |
|
||||
| **Light** | `#F8FAFC` (Slate 50) | Light backgrounds |
|
||||
|
||||
### Logo Concept
|
||||
|
||||
```text
|
||||
╔═══╗
|
||||
║ S ║ ← Capas apiladas (stratum)
|
||||
╠═══╣
|
||||
║ O ║ ← Ops = engranaje/automation
|
||||
╚═══╝
|
||||
```
|
||||
|
||||
### Typography
|
||||
|
||||
| Uso | Font |
|
||||
|-----|------|
|
||||
| **Headings** | Inter (bold, clean, tech) |
|
||||
| **Body** | Inter (regular) |
|
||||
| **Code** | JetBrains Mono |
|
||||
|
||||
---
|
||||
|
||||
*Documento generado: 2026-01-22*
|
||||
*Actualizado: 2026-01-22 (STRATUMIOPS → StratumIOps)*
|
||||
*Tipo: info (estrategia de marca y negocio)*
|
||||
*Proyecto: StratumIOps (nombre del portfolio)*
|
||||
454
assets/es/stratumiops-branding-guide.md
Normal file
@ -0,0 +1,454 @@
|
||||
# StratumIOps: Guía de Branding
|
||||
|
||||
## 1. Identidad de Marca
|
||||
|
||||
### Nombre
|
||||
|
||||
| Elemento | Valor |
|
||||
|----------|-------|
|
||||
| **Nombre completo** | StratumIOps |
|
||||
| **Pronunciación** | "Stratum-I-Ops" |
|
||||
| **Abreviación** | SIO (uso interno) |
|
||||
| **Dominio** | stratumiops.dev |
|
||||
|
||||
### Significado
|
||||
|
||||
```text
|
||||
STRATUMIOPS + I + Ops
|
||||
│ │ │
|
||||
│ │ └── Operations: automatización, DevOps, flujos
|
||||
│ │
|
||||
│ └── Intelligence: IA, agentes inteligentes, decisiones
|
||||
│
|
||||
└── Layers: capas de arquitectura, stack completo
|
||||
```
|
||||
|
||||
### Eslogan Principal
|
||||
|
||||
> **"Intelligent layers. Automated operations."**
|
||||
|
||||
### Eslóganes Alternativos
|
||||
|
||||
| Contexto | Eslogan |
|
||||
|----------|---------|
|
||||
| Técnico | "Stack intelligence. Automate everything." |
|
||||
| Flujo | "From knowledge to deployment. Automated." |
|
||||
| Beneficios | "Build smarter. Deploy faster." |
|
||||
| Enterprise | "The full-stack operations platform." |
|
||||
|
||||
---
|
||||
|
||||
## 2. Logo
|
||||
|
||||
### Concepto
|
||||
|
||||
El logo representa:
|
||||
- **Tres capas horizontales**: Arquitectura en niveles (Stratum)
|
||||
- **Nodo central brillante**: Inteligencia conectando las capas (I)
|
||||
- **Líneas de conexión**: Flujo de datos y operaciones (Ops)
|
||||
|
||||
### Versiones Disponibles
|
||||
|
||||
| Archivo | Uso |
|
||||
|---------|-----|
|
||||
| `stratumiops-logo.svg` | Principal, fondo claro |
|
||||
| `stratumiops-logo-dark.svg` | Fondo oscuro con background |
|
||||
| `stratumiops-logo-minimal.svg` | Versión simplificada |
|
||||
| `stratumiops-logo-monochrome.svg` | Un solo color |
|
||||
| `stratumiops-logo-horizontal.svg` | Con wordmark |
|
||||
|
||||
### Construcción del Logo
|
||||
|
||||
```text
|
||||
┌────────────────────────────────────────────────────────┐
|
||||
│ │
|
||||
│ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ← Capa 1 │
|
||||
│ │ │
|
||||
│ │ ← Conexión │
|
||||
│ ▼ │
|
||||
│ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓●▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ← Capa 2 + Nodo │
|
||||
│ │ (cyan) │
|
||||
│ │ ← Conexión │
|
||||
│ ▼ │
|
||||
│ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ← Capa 3 │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Área de Protección
|
||||
|
||||
```text
|
||||
┌─────────────────────────────────────┐
|
||||
│ │
|
||||
│ ┌─┬───────────────────────┬─┐ │
|
||||
│ │ │ │ │ │
|
||||
│ │ │ ═══════════════ │ │ │
|
||||
│ │ │ ═══════●═══════ │ │ │
|
||||
│ │X│ ═══════════════ │X│ │ X = altura del nodo
|
||||
│ │ │ │ │ │
|
||||
│ └─┴───────────────────────┴─┘ │
|
||||
│ │
|
||||
└─────────────────────────────────────┘
|
||||
|
||||
Espacio mínimo alrededor del logo = 1X (altura del nodo central)
|
||||
```
|
||||
|
||||
### Tamaños Mínimos
|
||||
|
||||
| Contexto | Tamaño mínimo |
|
||||
|----------|---------------|
|
||||
| Digital (pantalla) | 32px altura |
|
||||
| Impreso | 12mm altura |
|
||||
| Favicon | 16x16px (usar versión simplificada) |
|
||||
|
||||
---
|
||||
|
||||
## 3. Paleta de Colores
|
||||
|
||||
### Colores Primarios
|
||||
|
||||
| Nombre | Hex | RGB | Uso |
|
||||
|--------|-----|-----|-----|
|
||||
| **Indigo 500** | `#6366F1` | 99, 102, 241 | Logo principal, CTAs primarios |
|
||||
| **Indigo 600** | `#4F46E5` | 79, 70, 229 | Hover states, variante oscura |
|
||||
| **Indigo 400** | `#818CF8` | 129, 140, 248 | Fondos claros, highlights |
|
||||
|
||||
### Colores Secundarios (Accent)
|
||||
|
||||
| Nombre | Hex | RGB | Uso |
|
||||
|--------|-----|-----|-----|
|
||||
| **Cyan 400** | `#22D3EE` | 34, 211, 238 | Nodo inteligente, accents |
|
||||
| **Cyan 500** | `#06B6D4` | 6, 182, 212 | Highlights, iconos |
|
||||
| **Cyan 300** | `#67E8F9` | 103, 232, 249 | Glow effects |
|
||||
|
||||
### Colores Neutrales
|
||||
|
||||
| Nombre | Hex | RGB | Uso |
|
||||
|--------|-----|-----|-----|
|
||||
| **Slate 900** | `#0F172A` | 15, 23, 42 | Texto principal, fondos dark |
|
||||
| **Slate 700** | `#334155` | 51, 65, 85 | Texto secundario |
|
||||
| **Slate 400** | `#94A3B8` | 148, 163, 184 | Texto terciario, placeholders |
|
||||
| **Slate 200** | `#E2E8F0` | 226, 232, 240 | Bordes, divisores |
|
||||
| **Slate 50** | `#F8FAFC` | 248, 250, 252 | Fondos claros |
|
||||
|
||||
### Colores Semánticos
|
||||
|
||||
| Nombre | Hex | Uso |
|
||||
|--------|-----|-----|
|
||||
| **Success** | `#22C55E` | Confirmaciones, estados OK |
|
||||
| **Warning** | `#F59E0B` | Alertas, precauciones |
|
||||
| **Error** | `#EF4444` | Errores, estados críticos |
|
||||
| **Info** | `#3B82F6` | Información, tooltips |
|
||||
|
||||
### Gradientes
|
||||
|
||||
```css
|
||||
/* Gradiente principal del logo */
|
||||
.gradient-primary {
|
||||
background: linear-gradient(135deg, #6366F1 0%, #4F46E5 100%);
|
||||
}
|
||||
|
||||
/* Gradiente del nodo inteligente */
|
||||
.gradient-node {
|
||||
background: radial-gradient(circle, #22D3EE 0%, #06B6D4 100%);
|
||||
}
|
||||
|
||||
/* Gradiente para fondos hero */
|
||||
.gradient-hero {
|
||||
background: linear-gradient(180deg, #0F172A 0%, #1E293B 100%);
|
||||
}
|
||||
|
||||
/* Gradiente accent */
|
||||
.gradient-accent {
|
||||
background: linear-gradient(90deg, #6366F1 0%, #22D3EE 100%);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Tipografía
|
||||
|
||||
### Fuente Principal: Inter
|
||||
|
||||
| Peso | Uso |
|
||||
|------|-----|
|
||||
| **Inter Bold (700)** | Headings, títulos principales |
|
||||
| **Inter SemiBold (600)** | Subtítulos, énfasis |
|
||||
| **Inter Medium (500)** | Labels, navegación |
|
||||
| **Inter Regular (400)** | Cuerpo de texto |
|
||||
|
||||
### Fuente Código: JetBrains Mono
|
||||
|
||||
| Peso | Uso |
|
||||
|------|-----|
|
||||
| **JetBrains Mono Regular** | Código, terminal, snippets |
|
||||
| **JetBrains Mono Bold** | Código destacado |
|
||||
|
||||
### Escala Tipográfica
|
||||
|
||||
| Nombre | Tamaño | Line Height | Uso |
|
||||
|--------|--------|-------------|-----|
|
||||
| **Display** | 48px / 3rem | 1.1 | Hero headlines |
|
||||
| **H1** | 36px / 2.25rem | 1.2 | Títulos de página |
|
||||
| **H2** | 30px / 1.875rem | 1.25 | Secciones principales |
|
||||
| **H3** | 24px / 1.5rem | 1.3 | Subsecciones |
|
||||
| **H4** | 20px / 1.25rem | 1.4 | Cards, títulos menores |
|
||||
| **Body Large** | 18px / 1.125rem | 1.6 | Lead text |
|
||||
| **Body** | 16px / 1rem | 1.6 | Texto principal |
|
||||
| **Body Small** | 14px / 0.875rem | 1.5 | Captions, metadata |
|
||||
| **Code** | 14px / 0.875rem | 1.6 | Código inline |
|
||||
|
||||
### CSS Variables
|
||||
|
||||
```css
|
||||
:root {
|
||||
/* Font families */
|
||||
--font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||
--font-mono: 'JetBrains Mono', 'Fira Code', monospace;
|
||||
|
||||
/* Font sizes */
|
||||
--text-xs: 0.75rem;
|
||||
--text-sm: 0.875rem;
|
||||
--text-base: 1rem;
|
||||
--text-lg: 1.125rem;
|
||||
--text-xl: 1.25rem;
|
||||
--text-2xl: 1.5rem;
|
||||
--text-3xl: 1.875rem;
|
||||
--text-4xl: 2.25rem;
|
||||
--text-5xl: 3rem;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Iconografía
|
||||
|
||||
### Estilo
|
||||
|
||||
- **Tipo**: Outline icons (línea, no filled)
|
||||
- **Stroke width**: 1.5px - 2px
|
||||
- **Corner radius**: Consistente con el logo (redondeado)
|
||||
- **Tamaño base**: 24x24px
|
||||
- **Set recomendado**: Lucide Icons, Heroicons (outline)
|
||||
|
||||
### Iconos del Producto
|
||||
|
||||
| Producto | Icono Sugerido |
|
||||
|----------|----------------|
|
||||
| StratumIOps/knowledge | `book-open` + `brain` |
|
||||
| StratumIOps/orchestrate | `workflow` + `bot` |
|
||||
| StratumIOps/interact | `form-input` + `terminal` |
|
||||
| StratumIOps/provision | `server` + `cloud` |
|
||||
|
||||
---
|
||||
|
||||
## 6. Componentes UI
|
||||
|
||||
### Botones
|
||||
|
||||
```css
|
||||
/* Primario */
|
||||
.btn-primary {
|
||||
background: linear-gradient(135deg, #6366F1 0%, #4F46E5 100%);
|
||||
color: white;
|
||||
border-radius: 8px;
|
||||
padding: 12px 24px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background: linear-gradient(135deg, #4F46E5 0%, #4338CA 100%);
|
||||
}
|
||||
|
||||
/* Secundario */
|
||||
.btn-secondary {
|
||||
background: transparent;
|
||||
color: #6366F1;
|
||||
border: 2px solid #6366F1;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
/* Ghost */
|
||||
.btn-ghost {
|
||||
background: transparent;
|
||||
color: #6366F1;
|
||||
}
|
||||
```
|
||||
|
||||
### Cards
|
||||
|
||||
```css
|
||||
.card {
|
||||
background: white;
|
||||
border-radius: 12px;
|
||||
border: 1px solid #E2E8F0;
|
||||
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.card-dark {
|
||||
background: #1E293B;
|
||||
border: 1px solid #334155;
|
||||
}
|
||||
```
|
||||
|
||||
### Inputs
|
||||
|
||||
```css
|
||||
.input {
|
||||
border: 1px solid #E2E8F0;
|
||||
border-radius: 8px;
|
||||
padding: 12px 16px;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.input:focus {
|
||||
border-color: #6366F1;
|
||||
box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. Aplicaciones
|
||||
|
||||
### Website
|
||||
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ [Logo] Products Pricing Docs Blog [Sign In] │
|
||||
├─────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ StratumIOps │
|
||||
│ │
|
||||
│ Intelligent layers. │
|
||||
│ Automated operations. │
|
||||
│ │
|
||||
│ [Get Started] [View Demo] │
|
||||
│ │
|
||||
├─────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
|
||||
│ │Knowledge│ │Orchestr.│ │ Interact│ │Provision│ │
|
||||
│ │ ════ │ │ ════ │ │ ════ │ │ ════ │ │
|
||||
│ │ ═●═ │ │ ═●═ │ │ ═●═ │ │ ═●═ │ │
|
||||
│ │ ════ │ │ ════ │ │ ════ │ │ ════ │ │
|
||||
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Documentación
|
||||
|
||||
- Fondo: Slate 50 (#F8FAFC)
|
||||
- Sidebar: White con borde Slate 200
|
||||
- Code blocks: Slate 900 con syntax highlighting
|
||||
- Headers: Indigo 600
|
||||
|
||||
### Presentaciones
|
||||
|
||||
- Template dark: Slate 900 fondo, texto blanco
|
||||
- Template light: White fondo, texto Slate 900
|
||||
- Accent en todos los slides: Cyan para highlights
|
||||
|
||||
---
|
||||
|
||||
## 8. Uso Incorrecto
|
||||
|
||||
### No Hacer
|
||||
|
||||
```text
|
||||
❌ Cambiar los colores del logo
|
||||
❌ Rotar el logo
|
||||
❌ Añadir efectos (sombras, outlines extra)
|
||||
❌ Estirar o comprimir desproporcionadamente
|
||||
❌ Usar sobre fondos que reduzcan contraste
|
||||
❌ Separar el nodo de las capas
|
||||
❌ Cambiar la tipografía del wordmark
|
||||
❌ Usar versión completa cuando el espacio es muy pequeño
|
||||
```
|
||||
|
||||
### Fondos Permitidos
|
||||
|
||||
| Fondo | Versión del Logo |
|
||||
|-------|------------------|
|
||||
| Blanco / Claro | Logo principal (colores) |
|
||||
| Slate 900 / Negro | Logo dark version |
|
||||
| Indigo (brand color) | Logo monocromático blanco |
|
||||
| Fotografías | Solo si hay suficiente contraste |
|
||||
|
||||
---
|
||||
|
||||
## 9. Tono de Voz
|
||||
|
||||
### Personalidad de Marca
|
||||
|
||||
| Atributo | Descripción |
|
||||
|----------|-------------|
|
||||
| **Inteligente** | Conocemos el espacio, hablamos con autoridad técnica |
|
||||
| **Directo** | Sin rodeos, vamos al grano |
|
||||
| **Accesible** | Técnico pero no intimidante |
|
||||
| **Confiable** | Enterprise-ready, serio, profesional |
|
||||
| **Innovador** | Rust, Nickel, IA nativa - estamos adelante |
|
||||
|
||||
### Ejemplos de Copy
|
||||
|
||||
**Sí**:
|
||||
- "Deploy infrastructure with type-safe confidence."
|
||||
- "Your agents learn. Your costs drop."
|
||||
- "Knowledge that your AI actually uses."
|
||||
|
||||
**No**:
|
||||
- "Revolutionary AI-powered paradigm shift!" (hype)
|
||||
- "Super easy to use!" (vago)
|
||||
- "The best platform ever!" (superlativos vacíos)
|
||||
|
||||
---
|
||||
|
||||
## 10. Assets Digitales
|
||||
|
||||
### Archivos de Logo
|
||||
|
||||
```
|
||||
.coder/
|
||||
├── 2026-01-22-stratumiops-logo.svg # Principal
|
||||
├── 2026-01-22-stratumiops-logo-dark.svg # Fondo oscuro
|
||||
├── 2026-01-22-stratumiops-logo-minimal.svg # Simplificado
|
||||
├── 2026-01-22-stratumiops-logo-monochrome.svg # Un color
|
||||
└── 2026-01-22-stratumiops-logo-horizontal.svg # Con wordmark
|
||||
```
|
||||
|
||||
### Exportaciones Necesarias
|
||||
|
||||
```
|
||||
/brand/
|
||||
├── logo/
|
||||
│ ├── svg/ # Todos los SVG
|
||||
│ ├── png/ # 64, 128, 256, 512, 1024px
|
||||
│ ├── favicon/ # ico, png 16/32/48
|
||||
│ └── social/ # Open Graph, Twitter cards
|
||||
├── colors/
|
||||
│ └── palette.css # Variables CSS
|
||||
├── fonts/
|
||||
│ └── README.md # Links a Inter y JetBrains Mono
|
||||
└── templates/
|
||||
├── presentation/ # Slides templates
|
||||
└── documents/ # Letterhead, etc.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 11. Contacto y Recursos
|
||||
|
||||
| Recurso | URL |
|
||||
|---------|-----|
|
||||
| Website | stratumiops.dev |
|
||||
| Docs | docs.stratumiops.dev |
|
||||
| GitHub | github.com/stratumiops |
|
||||
| Twitter/X | @stratumiops |
|
||||
| Discord | discord.gg/stratumiops |
|
||||
|
||||
---
|
||||
|
||||
*Guía de Branding v1.0*
|
||||
*Documento generado: 2026-01-22*
|
||||
*Proyecto: StratumIOps*
|
||||
220
assets/es/stratumiops-logo-prompts.md
Normal file
@ -0,0 +1,220 @@
|
||||
# StratumIOps: Prompts para Generación de Logo
|
||||
|
||||
## Concepto del Logo
|
||||
|
||||
| Elemento | Significado Visual |
|
||||
|----------|-------------------|
|
||||
| **Stratum** | Capas apiladas, estratos geológicos, arquitectura en niveles |
|
||||
| **I** | Inteligencia, nodo central, conexión neuronal |
|
||||
| **Ops** | Engranajes, flujo, automatización, ciclo continuo |
|
||||
|
||||
---
|
||||
|
||||
## Prompts para IA (Midjourney/DALL-E/Ideogram)
|
||||
|
||||
### Prompt Principal (Abstracto Geométrico)
|
||||
|
||||
```
|
||||
A modern minimalist tech logo for "StratumIOps", featuring three horizontal
|
||||
stacked layers with a glowing neural node in the center representing
|
||||
intelligence. Clean geometric design with subtle gradient from indigo (#6366F1)
|
||||
to cyan (#22D3EE). The layers suggest depth and architecture. Professional
|
||||
SaaS company aesthetic. Vector style, scalable, works on dark and light
|
||||
backgrounds. No text in the logo mark.
|
||||
```
|
||||
|
||||
### Prompt Variante 1 (Capas + Circuito)
|
||||
|
||||
```
|
||||
Minimalist logo icon: three horizontal parallel lines stacked vertically
|
||||
representing layers/strata, with a small glowing circuit node connecting
|
||||
them in the center. Color palette: indigo to cyan gradient. Tech startup
|
||||
aesthetic, clean lines, geometric precision. Silicon Valley style.
|
||||
Suitable for app icon and favicon. Vector art, flat design with subtle
|
||||
depth. Dark background version.
|
||||
```
|
||||
|
||||
### Prompt Variante 2 (Hexagonal)
|
||||
|
||||
```
|
||||
Hexagonal tech logo with three internal horizontal divisions representing
|
||||
layers. A bright intelligent core at the center. Modern DevOps platform
|
||||
branding. Colors: deep indigo (#4F46E5) transitioning to electric cyan
|
||||
(#06B6D4). Minimalist, professional, suitable for enterprise software.
|
||||
Clean vector style, no gradients on the shape, gradient only on accent.
|
||||
```
|
||||
|
||||
### Prompt Variante 3 (Isométrico)
|
||||
|
||||
```
|
||||
Isometric 3D logo showing three stacked platform layers with a glowing
|
||||
intelligence core. Modern cloud infrastructure aesthetic. Clean geometric
|
||||
shapes, professional tech company style. Primary color indigo with cyan
|
||||
accent highlights. Suitable for both light and dark modes. Minimal,
|
||||
sophisticated, enterprise-ready design.
|
||||
```
|
||||
|
||||
### Prompt Variante 4 (Letra S Estilizada)
|
||||
|
||||
```
|
||||
Stylized letter "S" logo made of three horizontal stacked segments
|
||||
representing layers/strata. A small glowing dot in the center segment
|
||||
representing the "I" of intelligence. Modern tech company aesthetic.
|
||||
Indigo (#6366F1) as primary color with cyan (#22D3EE) accent on the
|
||||
intelligence node. Clean, minimal, vector style. Works as app icon.
|
||||
```
|
||||
|
||||
### Prompt Variante 5 (Flujo de Datos)
|
||||
|
||||
```
|
||||
Abstract logo showing data flowing through three horizontal layers,
|
||||
with a central processing node glowing with intelligence. Represents
|
||||
automated operations across architectural layers. Tech platform aesthetic.
|
||||
Indigo to cyan color scheme. Minimalist, professional, suitable for
|
||||
developer tools company. Vector art, clean lines.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Prompts para Versiones Específicas
|
||||
|
||||
### App Icon / Favicon
|
||||
|
||||
```
|
||||
Square app icon design: simplified three-layer stack with glowing center
|
||||
node. Must be recognizable at 16x16 pixels. High contrast, indigo
|
||||
background with cyan/white accent. Minimal detail, bold shapes.
|
||||
Tech platform favicon style.
|
||||
```
|
||||
|
||||
### Versión Monocromática
|
||||
|
||||
```
|
||||
Single color logo version: three stacked horizontal bars with center
|
||||
connection point. Works in pure white, pure black, or single brand color.
|
||||
No gradients, pure vector shapes. Suitable for watermarks, embossing,
|
||||
single-color printing.
|
||||
```
|
||||
|
||||
### Versión Horizontal (con Wordmark)
|
||||
|
||||
```
|
||||
Horizontal logo lockup: geometric icon of three stacked layers with
|
||||
intelligent core on the left, "StratumIOps" wordmark on the right in
|
||||
clean sans-serif font (Inter or similar). Professional tech company
|
||||
style. Indigo primary with cyan accent. Balanced spacing.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Especificaciones Técnicas para el Diseñador
|
||||
|
||||
### Dimensiones Base
|
||||
|
||||
| Uso | Tamaño | Formato |
|
||||
|-----|--------|---------|
|
||||
| Logo mark (icon) | 512x512 px | SVG, PNG |
|
||||
| Favicon | 32x32, 16x16 px | ICO, PNG |
|
||||
| App icon | 1024x1024 px | PNG |
|
||||
| Social media | 400x400 px | PNG |
|
||||
| Horizontal lockup | 1200x300 px | SVG, PNG |
|
||||
|
||||
### Colores para Especificar
|
||||
|
||||
| Color | Hex | RGB | Uso |
|
||||
|-------|-----|-----|-----|
|
||||
| Primary Indigo | `#6366F1` | 99, 102, 241 | Logo principal |
|
||||
| Deep Indigo | `#4F46E5` | 79, 70, 229 | Variante oscura |
|
||||
| Cyan Accent | `#22D3EE` | 34, 211, 238 | Nodo inteligente |
|
||||
| Electric Cyan | `#06B6D4` | 6, 182, 212 | Highlights |
|
||||
| Dark Background | `#0F172A` | 15, 23, 42 | Fondo oscuro |
|
||||
| Light Background | `#F8FAFC` | 248, 250, 252 | Fondo claro |
|
||||
|
||||
### Requisitos de Entrega
|
||||
|
||||
```
|
||||
□ Logo mark SVG (vector escalable)
|
||||
□ Logo mark PNG (512px, 1024px, 2048px)
|
||||
□ Favicon ICO (16px, 32px, 48px)
|
||||
□ App icon PNG (1024px con esquinas redondeadas)
|
||||
□ Horizontal lockup SVG
|
||||
□ Horizontal lockup PNG (múltiples tamaños)
|
||||
□ Versión monocromática (blanco, negro)
|
||||
□ Versión sobre fondo oscuro
|
||||
□ Versión sobre fondo claro
|
||||
□ Archivo fuente editable (Figma/AI/Sketch)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Conceptos Visuales de Referencia
|
||||
|
||||
### Mood Board Keywords
|
||||
|
||||
```
|
||||
- Layered architecture
|
||||
- Neural network node
|
||||
- Cloud infrastructure
|
||||
- DevOps pipeline
|
||||
- Data flow visualization
|
||||
- Geometric minimalism
|
||||
- Enterprise SaaS
|
||||
- Developer tools
|
||||
- Platform engineering
|
||||
- Intelligent automation
|
||||
```
|
||||
|
||||
### Logos de Referencia (Estilo Similar)
|
||||
|
||||
- **Vercel** - Simplicidad geométrica, triángulo
|
||||
- **Linear** - Minimalismo, líneas limpias
|
||||
- **Supabase** - Gradientes sutiles, tech feel
|
||||
- **Prisma** - Formas geométricas, profundidad
|
||||
- **Planetscale** - Capas, movimiento
|
||||
- **Railway** - Simple, memorable, tech
|
||||
|
||||
---
|
||||
|
||||
## Ejemplos de Concepto ASCII
|
||||
|
||||
### Concepto 1: Capas con Nodo Central
|
||||
|
||||
```
|
||||
════════════════
|
||||
════════●═══════ ← Nodo inteligente (cyan)
|
||||
════════════════
|
||||
```
|
||||
|
||||
### Concepto 2: S Estilizada
|
||||
|
||||
```
|
||||
╔═══════════╗
|
||||
╠═════●═════╣ ← I de Intelligence
|
||||
╚═══════════╝
|
||||
```
|
||||
|
||||
### Concepto 3: Hexagonal
|
||||
|
||||
```
|
||||
╱────────╲
|
||||
╱──────────╲
|
||||
│ ● │ ← Core inteligente
|
||||
╲──────────╱
|
||||
╲────────╱
|
||||
```
|
||||
|
||||
### Concepto 4: Isométrico
|
||||
|
||||
```
|
||||
▁▁▁▁▁▁▁
|
||||
╱ ╲
|
||||
▕ ● ▏ ← Nodo
|
||||
╲_______╱
|
||||
▔▔▔▔▔▔▔
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
*Documento generado: 2026-01-22*
|
||||
*Proyecto: StratumIOps*
|
||||
*Uso: Generación de logo con IA o brief para diseñador*
|
||||
77
assets/logos/stratumiops-dark-h.svg
Normal file
@ -0,0 +1,77 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 300" width="800" height="300">
|
||||
<defs>
|
||||
<linearGradient id="dhLayerGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="100%" style="stop-color:#4F46E5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="dhProcessorGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#06B6D4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="dhFlowGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="dhUnderlineGrad" x1="280" y1="195" x2="750" y2="195" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
</linearGradient>
|
||||
<filter id="dhProcessorGlow" x="-40%" y="-40%" width="180%" height="180%">
|
||||
<feGaussianBlur stdDeviation="6" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter id="dhNodeGlow" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="3" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<style>
|
||||
.dh-wordmark { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; font-weight: 700; }
|
||||
</style>
|
||||
</defs>
|
||||
|
||||
<!-- Dark background -->
|
||||
<rect width="1200" height="300" fill="#0F172A"/>
|
||||
|
||||
<!-- Logo Icon -->
|
||||
<g transform="translate(20, 50)">
|
||||
<!-- Layers -->
|
||||
<rect x="0" y="18" width="220" height="24" rx="5" fill="url(#dhLayerGrad)" opacity="0.75"/>
|
||||
<rect x="0" y="88" width="220" height="24" rx="5" fill="url(#dhLayerGrad)"/>
|
||||
<rect x="0" y="158" width="220" height="24" rx="5" fill="url(#dhLayerGrad)" opacity="0.75"/>
|
||||
|
||||
<!-- Flows -->
|
||||
<path d="M35 42 Q35 65 70 85 Q95 100 95 100" stroke="url(#dhFlowGrad)" stroke-width="3" fill="none" opacity="0.7" stroke-linecap="round"/>
|
||||
<path d="M185 42 Q185 65 150 85 Q125 100 125 100" stroke="url(#dhFlowGrad)" stroke-width="3" fill="none" opacity="0.7" stroke-linecap="round"/>
|
||||
<path d="M95 100 Q95 100 70 115 Q35 135 35 158" stroke="url(#dhFlowGrad)" stroke-width="3" fill="none" opacity="0.7" stroke-linecap="round"/>
|
||||
<path d="M125 100 Q125 100 150 115 Q185 135 185 158" stroke="url(#dhFlowGrad)" stroke-width="3" fill="none" opacity="0.7" stroke-linecap="round"/>
|
||||
|
||||
<!-- I/O Points -->
|
||||
<circle cx="35" cy="30" r="7" fill="#22D3EE" filter="url(#dhNodeGlow)"/>
|
||||
<circle cx="185" cy="30" r="7" fill="#22D3EE" filter="url(#dhNodeGlow)"/>
|
||||
<circle cx="35" cy="170" r="7" fill="#6366F1" filter="url(#dhNodeGlow)"/>
|
||||
<circle cx="185" cy="170" r="7" fill="#6366F1" filter="url(#dhNodeGlow)"/>
|
||||
|
||||
<!-- Central processor -->
|
||||
<rect x="85" y="75" width="50" height="50" rx="9" fill="url(#dhProcessorGrad)" filter="url(#dhProcessorGlow)"/>
|
||||
<rect x="97" y="87" width="26" height="26" rx="5" fill="#ffffff" opacity="0.95"/>
|
||||
|
||||
<!-- Equalizer bars -->
|
||||
<rect x="101" y="93" width="4" height="11" rx="1" fill="#22D3EE"/>
|
||||
<rect x="108" y="91" width="4" height="15" rx="1" fill="#06B6D4"/>
|
||||
<rect x="115" y="94" width="4" height="9" rx="1" fill="#22D3EE"/>
|
||||
</g>
|
||||
|
||||
<!-- Wordmark -->
|
||||
<text x="280" y="175" class="dh-wordmark" font-size="72" fill="url(#dhLayerGrad)">Stratum<tspan fill="url(#dhProcessorGrad)">I</tspan>Ops</text>
|
||||
|
||||
<!-- Underline -->
|
||||
<line x1="280" y1="195" x2="750" y2="195" stroke="url(#dhUnderlineGrad)" stroke-width="3" stroke-linecap="round" opacity="0.7"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.8 KiB |
78
assets/logos/stratumiops-dark-v.svg
Normal file
@ -0,0 +1,78 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400" width="400" height="400">
|
||||
<defs>
|
||||
<linearGradient id="dvLayerGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="100%" style="stop-color:#4F46E5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="dvProcessorGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#06B6D4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="dvFlowGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="dvUnderlineGrad" x1="45" y1="305" x2="355" y2="305" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
</linearGradient>
|
||||
<filter id="dvProcessorGlow" x="-40%" y="-40%" width="180%" height="180%">
|
||||
<feGaussianBlur stdDeviation="8" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter id="dvNodeGlow" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="4" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<style>
|
||||
.dv-wordmark { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; font-weight: 700; }
|
||||
</style>
|
||||
</defs>
|
||||
|
||||
<!-- Dark background -->
|
||||
<rect width="400" height="400" fill="#0F172A"/>
|
||||
|
||||
<!-- Logo Icon (centered) -->
|
||||
<g transform="translate(90, 40)">
|
||||
<!-- Layers -->
|
||||
<rect x="0" y="18" width="220" height="24" rx="5" fill="url(#dvLayerGrad)" opacity="0.75"/>
|
||||
<rect x="0" y="88" width="220" height="24" rx="5" fill="url(#dvLayerGrad)"/>
|
||||
<rect x="0" y="158" width="220" height="24" rx="5" fill="url(#dvLayerGrad)" opacity="0.75"/>
|
||||
|
||||
<!-- Flows -->
|
||||
<path d="M35 42 Q35 65 70 85 Q95 100 95 100" stroke="url(#dvFlowGrad)" stroke-width="3" fill="none" opacity="0.7" stroke-linecap="round"/>
|
||||
<path d="M185 42 Q185 65 150 85 Q125 100 125 100" stroke="url(#dvFlowGrad)" stroke-width="3" fill="none" opacity="0.7" stroke-linecap="round"/>
|
||||
<path d="M95 100 Q95 100 70 115 Q35 135 35 158" stroke="url(#dvFlowGrad)" stroke-width="3" fill="none" opacity="0.7" stroke-linecap="round"/>
|
||||
<path d="M125 100 Q125 100 150 115 Q185 135 185 158" stroke="url(#dvFlowGrad)" stroke-width="3" fill="none" opacity="0.7" stroke-linecap="round"/>
|
||||
|
||||
<!-- I/O Points -->
|
||||
<circle cx="35" cy="30" r="7" fill="#22D3EE" filter="url(#dvNodeGlow)"/>
|
||||
<circle cx="185" cy="30" r="7" fill="#22D3EE" filter="url(#dvNodeGlow)"/>
|
||||
<circle cx="35" cy="170" r="7" fill="#6366F1" filter="url(#dvNodeGlow)"/>
|
||||
<circle cx="185" cy="170" r="7" fill="#6366F1" filter="url(#dvNodeGlow)"/>
|
||||
|
||||
<!-- Central processor -->
|
||||
<rect x="85" y="75" width="50" height="50" rx="9" fill="url(#dvProcessorGrad)" filter="url(#dvProcessorGlow)"/>
|
||||
<rect x="97" y="87" width="26" height="26" rx="5" fill="#ffffff" opacity="0.95"/>
|
||||
|
||||
<!-- Equalizer bars -->
|
||||
<rect x="101" y="96" width="4" height="13" rx="1" fill="#22D3EE"/>
|
||||
<rect x="108" y="93" width="4" height="18" rx="1" fill="#06B6D4"/>
|
||||
<rect x="115" y="95" width="4" height="14" rx="1" fill="#22D3EE"/>
|
||||
</g>
|
||||
|
||||
<!-- Wordmark (centered below icon) -->
|
||||
<text x="200" y="285" class="dv-wordmark" font-size="48" fill="url(#dvLayerGrad)" text-anchor="middle">Stratum<tspan fill="url(#dvProcessorGrad)">I</tspan>Ops</text>
|
||||
|
||||
<!-- Underline -->
|
||||
<line x1="45" y1="305" x2="355" y2="305" stroke="url(#dvUnderlineGrad)" stroke-width="3" stroke-linecap="round" opacity="0.7"/>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
21
assets/logos/stratumiops-favicon-16.svg
Normal file
@ -0,0 +1,21 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
|
||||
<defs>
|
||||
<linearGradient id="fGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="100%" style="stop-color:#4F46E5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="fCore" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#06B6D4"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Three simplified bars -->
|
||||
<rect x="1" y="2" width="14" height="2" rx="0.5" fill="url(#fGrad)" opacity="0.7"/>
|
||||
<rect x="1" y="7" width="14" height="2" rx="0.5" fill="url(#fGrad)"/>
|
||||
<rect x="1" y="12" width="14" height="2" rx="0.5" fill="url(#fGrad)" opacity="0.7"/>
|
||||
|
||||
<!-- Simplified central processor -->
|
||||
<rect x="5" y="5" width="6" height="6" rx="1" fill="url(#fCore)"/>
|
||||
<rect x="6" y="6" width="4" height="4" rx="0.5" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 966 B |
21
assets/logos/stratumiops-favicon-32.svg
Normal file
@ -0,0 +1,21 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32">
|
||||
<defs>
|
||||
<linearGradient id="f32Grad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="100%" style="stop-color:#4F46E5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="f32Core" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#06B6D4"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Three bars -->
|
||||
<rect x="2" y="4" width="28" height="4" rx="1" fill="url(#f32Grad)" opacity="0.7"/>
|
||||
<rect x="2" y="14" width="28" height="4" rx="1" fill="url(#f32Grad)"/>
|
||||
<rect x="2" y="24" width="28" height="4" rx="1" fill="url(#f32Grad)" opacity="0.7"/>
|
||||
|
||||
<!-- Central processor -->
|
||||
<rect x="10" y="10" width="12" height="12" rx="2" fill="url(#f32Core)"/>
|
||||
<rect x="13" y="13" width="6" height="6" rx="1" fill="#ffffff"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 955 B |
76
assets/logos/stratumiops-h-static.svg
Normal file
@ -0,0 +1,76 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 300" width="800" height="300">
|
||||
<defs>
|
||||
<linearGradient id="hpsLayerGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="100%" style="stop-color:#4F46E5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hpsProcessorGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#06B6D4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hpsFlowGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hpsUnderlineGrad" x1="280" y1="195" x2="750" y2="195" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
</linearGradient>
|
||||
<filter id="hpsProcessorGlow" x="-30%" y="-30%" width="160%" height="160%">
|
||||
<feGaussianBlur stdDeviation="5" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter id="hpsNodeGlow" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="2" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<style>
|
||||
.hps-wordmark { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; font-weight: 700; }
|
||||
</style>
|
||||
</defs>
|
||||
|
||||
<!-- Logo Icon -->
|
||||
<g transform="translate(20, 50)">
|
||||
<!-- Layers -->
|
||||
<rect x="0" y="18" width="220" height="24" rx="5" fill="url(#hpsLayerGrad)" opacity="0.7"/>
|
||||
<rect x="0" y="88" width="220" height="24" rx="5" fill="url(#hpsLayerGrad)"/>
|
||||
<rect x="0" y="158" width="220" height="24" rx="5" fill="url(#hpsLayerGrad)" opacity="0.7"/>
|
||||
|
||||
<!-- Flows -->
|
||||
<path d="M35 42 Q35 65 70 85 Q95 100 95 100" stroke="url(#hpsFlowGrad)" stroke-width="3" fill="none" opacity="0.6" stroke-linecap="round"/>
|
||||
<path d="M185 42 Q185 65 150 85 Q125 100 125 100" stroke="url(#hpsFlowGrad)" stroke-width="3" fill="none" opacity="0.6" stroke-linecap="round"/>
|
||||
<path d="M95 100 Q95 100 70 115 Q35 135 35 158" stroke="url(#hpsFlowGrad)" stroke-width="3" fill="none" opacity="0.6" stroke-linecap="round"/>
|
||||
<path d="M125 100 Q125 100 150 115 Q185 135 185 158" stroke="url(#hpsFlowGrad)" stroke-width="3" fill="none" opacity="0.6" stroke-linecap="round"/>
|
||||
|
||||
<!-- I/O Points -->
|
||||
<circle cx="35" cy="30" r="6" fill="#22D3EE" filter="url(#hpsNodeGlow)"/>
|
||||
<circle cx="185" cy="30" r="6" fill="#22D3EE" filter="url(#hpsNodeGlow)"/>
|
||||
<circle cx="35" cy="170" r="6" fill="#6366F1" filter="url(#hpsNodeGlow)"/>
|
||||
<circle cx="185" cy="170" r="6" fill="#6366F1" filter="url(#hpsNodeGlow)"/>
|
||||
|
||||
<!-- Central processor -->
|
||||
<rect x="85" y="75" width="50" height="50" rx="9" fill="url(#hpsProcessorGrad)" filter="url(#hpsProcessorGlow)"/>
|
||||
<rect x="97" y="87" width="26" height="26" rx="5" fill="#ffffff" opacity="0.95"/>
|
||||
|
||||
<!-- Static equalizer bars -->
|
||||
<rect x="101" y="93" width="4" height="11" rx="1" fill="#22D3EE"/>
|
||||
<rect x="108" y="91" width="4" height="15" rx="1" fill="#06B6D4"/>
|
||||
<rect x="115" y="94" width="4" height="9" rx="1" fill="#22D3EE"/>
|
||||
</g>
|
||||
|
||||
<!-- Wordmark -->
|
||||
<text x="280" y="175" class="hps-wordmark" font-size="72" fill="url(#hpsLayerGrad)">
|
||||
Stratum<tspan fill="url(#hpsProcessorGrad)">I</tspan>Ops
|
||||
</text>
|
||||
|
||||
<!-- Underline -->
|
||||
<line x1="280" y1="195" x2="750" y2="195" stroke="url(#hpsUnderlineGrad)" stroke-width="3" stroke-linecap="round" opacity="0.7"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.8 KiB |
191
assets/logos/stratumiops-h.svg
Normal file
@ -0,0 +1,191 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 300" width="800" height="300">
|
||||
<defs>
|
||||
<linearGradient id="hpLayerGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="100%" style="stop-color:#4F46E5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hpProcessorGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#06B6D4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hpFlowGrad" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
<animate attributeName="x1" values="0%;100%;0%" dur="2.5s" repeatCount="indefinite"/>
|
||||
<animate attributeName="x2" values="100%;200%;100%" dur="2.5s" repeatCount="indefinite"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hpUnderlineGrad" x1="280" y1="195" x2="750" y2="195" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hpShimmer" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="40%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="60%" style="stop-color:#6366F1"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
<animate attributeName="x1" values="-100%;100%" dur="3s" repeatCount="indefinite" begin="2s"/>
|
||||
<animate attributeName="x2" values="0%;200%" dur="3s" repeatCount="indefinite" begin="2s"/>
|
||||
</linearGradient>
|
||||
<filter id="hpProcessorGlow" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="5" result="coloredBlur">
|
||||
<animate attributeName="stdDeviation" values="4;8;4" dur="1.5s" repeatCount="indefinite"/>
|
||||
</feGaussianBlur>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter id="hpNodeGlow" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="3" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<clipPath id="hpTextReveal">
|
||||
<rect x="280" y="80" width="0" height="150">
|
||||
<animate attributeName="width" values="0;800" dur="1s" fill="freeze" begin="1s" calcMode="spline" keySplines="0.25 0.1 0.25 1"/>
|
||||
</rect>
|
||||
</clipPath>
|
||||
|
||||
<path id="hpPathIn1" d="M25 40 Q25 65 55 80 Q85 95 95 100" fill="none"/>
|
||||
<path id="hpPathIn2" d="M215 40 Q215 65 185 80 Q155 95 145 100" fill="none"/>
|
||||
<path id="hpPathOut1" d="M95 100 Q85 105 55 120 Q25 135 25 160" fill="none"/>
|
||||
<path id="hpPathOut2" d="M145 100 Q155 105 185 120 Q215 135 215 160" fill="none"/>
|
||||
|
||||
<style>
|
||||
.hp-wordmark { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; font-weight: 700; }
|
||||
</style>
|
||||
</defs>
|
||||
|
||||
<!-- Logo Icon -->
|
||||
<g transform="translate(20, 50)">
|
||||
<!-- Layers -->
|
||||
<rect x="-220" y="18" width="220" height="24" rx="5" fill="url(#hpLayerGrad)" opacity="0.7">
|
||||
<animate attributeName="x" values="-220;0" dur="0.5s" fill="freeze" calcMode="spline" keySplines="0.25 0.1 0.25 1"/>
|
||||
<animate attributeName="opacity" values="0.5;0.8;0.5" dur="3s" repeatCount="indefinite" begin="1.5s"/>
|
||||
</rect>
|
||||
<rect x="-220" y="88" width="220" height="24" rx="5" fill="url(#hpLayerGrad)">
|
||||
<animate attributeName="x" values="-220;0" dur="0.5s" fill="freeze" begin="0.15s" calcMode="spline" keySplines="0.25 0.1 0.25 1"/>
|
||||
</rect>
|
||||
<rect x="-220" y="158" width="220" height="24" rx="5" fill="url(#hpLayerGrad)" opacity="0.7">
|
||||
<animate attributeName="x" values="-220;0" dur="0.5s" fill="freeze" begin="0.3s" calcMode="spline" keySplines="0.25 0.1 0.25 1"/>
|
||||
<animate attributeName="opacity" values="0.8;0.5;0.8" dur="3s" repeatCount="indefinite" begin="1.5s"/>
|
||||
</rect>
|
||||
|
||||
<!-- Flows -->
|
||||
<path d="M35 42 Q35 65 70 85 Q95 100 95 100" stroke="url(#hpFlowGrad)" stroke-width="3" fill="none" opacity="0" stroke-linecap="round">
|
||||
<animate attributeName="opacity" values="0;0.6" dur="0.3s" fill="freeze" begin="0.5s"/>
|
||||
</path>
|
||||
<path d="M185 42 Q185 65 150 85 Q125 100 125 100" stroke="url(#hpFlowGrad)" stroke-width="3" fill="none" opacity="0" stroke-linecap="round">
|
||||
<animate attributeName="opacity" values="0;0.6" dur="0.3s" fill="freeze" begin="0.6s"/>
|
||||
</path>
|
||||
<path d="M95 100 Q95 100 70 115 Q35 135 35 158" stroke="url(#hpFlowGrad)" stroke-width="3" fill="none" opacity="0" stroke-linecap="round">
|
||||
<animate attributeName="opacity" values="0;0.6" dur="0.3s" fill="freeze" begin="0.7s"/>
|
||||
</path>
|
||||
<path d="M125 100 Q125 100 150 115 Q185 135 185 158" stroke="url(#hpFlowGrad)" stroke-width="3" fill="none" opacity="0" stroke-linecap="round">
|
||||
<animate attributeName="opacity" values="0;0.6" dur="0.3s" fill="freeze" begin="0.8s"/>
|
||||
</path>
|
||||
|
||||
<!-- Particles -->
|
||||
<circle r="4" fill="#22D3EE" filter="url(#hpNodeGlow)">
|
||||
<animateMotion dur="1.2s" repeatCount="indefinite" begin="1.5s">
|
||||
<mpath href="#hpPathIn1"/>
|
||||
</animateMotion>
|
||||
<animate attributeName="opacity" values="1;0.5;0.2" dur="1.2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
</circle>
|
||||
<circle r="4" fill="#22D3EE" filter="url(#hpNodeGlow)">
|
||||
<animateMotion dur="1.2s" repeatCount="indefinite" begin="1.8s">
|
||||
<mpath href="#hpPathIn2"/>
|
||||
</animateMotion>
|
||||
<animate attributeName="opacity" values="1;0.5;0.2" dur="1.2s" repeatCount="indefinite" begin="1.8s"/>
|
||||
</circle>
|
||||
<circle r="3" fill="#6366F1">
|
||||
<animateMotion dur="1.2s" repeatCount="indefinite" begin="2.1s">
|
||||
<mpath href="#hpPathOut1"/>
|
||||
</animateMotion>
|
||||
<animate attributeName="opacity" values="0.2;0.5;1" dur="1.2s" repeatCount="indefinite" begin="2.1s"/>
|
||||
</circle>
|
||||
<circle r="3" fill="#6366F1">
|
||||
<animateMotion dur="1.2s" repeatCount="indefinite" begin="2.4s">
|
||||
<mpath href="#hpPathOut2"/>
|
||||
</animateMotion>
|
||||
<animate attributeName="opacity" values="0.2;0.5;1" dur="1.2s" repeatCount="indefinite" begin="2.4s"/>
|
||||
</circle>
|
||||
|
||||
<!-- I/O Points -->
|
||||
<circle cx="35" cy="30" r="0" fill="#22D3EE" filter="url(#hpNodeGlow)">
|
||||
<animate attributeName="r" values="0;6" dur="0.2s" fill="freeze" begin="0.25s"/>
|
||||
<animate attributeName="r" values="5;7;5" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
</circle>
|
||||
<circle cx="185" cy="30" r="0" fill="#22D3EE" filter="url(#hpNodeGlow)">
|
||||
<animate attributeName="r" values="0;6" dur="0.2s" fill="freeze" begin="0.3s"/>
|
||||
<animate attributeName="r" values="6;5;6" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
</circle>
|
||||
<circle cx="35" cy="170" r="0" fill="#6366F1">
|
||||
<animate attributeName="r" values="0;6" dur="0.2s" fill="freeze" begin="0.4s"/>
|
||||
<animate attributeName="r" values="5;7;5" dur="2s" repeatCount="indefinite" begin="1.8s"/>
|
||||
</circle>
|
||||
<circle cx="185" cy="170" r="0" fill="#6366F1">
|
||||
<animate attributeName="r" values="0;6" dur="0.2s" fill="freeze" begin="0.45s"/>
|
||||
<animate attributeName="r" values="6;5;6" dur="2s" repeatCount="indefinite" begin="1.8s"/>
|
||||
</circle>
|
||||
|
||||
<!-- Central processor -->
|
||||
<rect x="85" y="75" width="50" height="50" rx="9" fill="url(#hpProcessorGrad)" filter="url(#hpProcessorGlow)" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.3s" fill="freeze" begin="0.45s"/>
|
||||
</rect>
|
||||
<rect x="97" y="87" width="26" height="26" rx="5" fill="#ffffff" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0.95" dur="0.25s" fill="freeze" begin="0.55s"/>
|
||||
</rect>
|
||||
|
||||
<!-- Equalizer bars -->
|
||||
<rect x="101" y="96" width="4" height="8" rx="1" fill="#22D3EE" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.15s" fill="freeze" begin="0.7s"/>
|
||||
<animate attributeName="height" values="8;14;6;10;8" dur="0.6s" repeatCount="indefinite" begin="1.2s"/>
|
||||
<animate attributeName="y" values="96;93;97;95;96" dur="0.6s" repeatCount="indefinite" begin="1.2s"/>
|
||||
</rect>
|
||||
<rect x="108" y="93" width="4" height="14" rx="1" fill="#06B6D4" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.15s" fill="freeze" begin="0.75s"/>
|
||||
<animate attributeName="height" values="14;8;12;16;14" dur="0.55s" repeatCount="indefinite" begin="1.25s"/>
|
||||
<animate attributeName="y" values="93;96;94;92;93" dur="0.55s" repeatCount="indefinite" begin="1.25s"/>
|
||||
</rect>
|
||||
<rect x="115" y="95" width="4" height="10" rx="1" fill="#22D3EE" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.15s" fill="freeze" begin="0.8s"/>
|
||||
<animate attributeName="height" values="10;16;8;12;10" dur="0.5s" repeatCount="indefinite" begin="1.3s"/>
|
||||
<animate attributeName="y" values="95;92;96;94;95" dur="0.5s" repeatCount="indefinite" begin="1.3s"/>
|
||||
</rect>
|
||||
|
||||
<!-- Processor pulse -->
|
||||
<rect x="85" y="75" width="50" height="50" rx="9" fill="none" stroke="#22D3EE" stroke-width="1.5" opacity="0">
|
||||
<animate attributeName="x" values="85;70" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="y" values="75;60" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="width" values="50;80" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="height" values="50;80" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="rx" values="9;14" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="opacity" values="0.5;0" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
</rect>
|
||||
</g>
|
||||
|
||||
<!-- Wordmark -->
|
||||
<g clip-path="url(#hpTextReveal)">
|
||||
<text x="280" y="175" class="hp-wordmark" font-size="72" fill="url(#hpShimmer)">
|
||||
Stratum<tspan fill="url(#hpProcessorGrad)">I</tspan>Ops
|
||||
</text>
|
||||
</g>
|
||||
|
||||
<!-- Cursor -->
|
||||
<rect x="280" y="115" width="4" height="70" rx="2" fill="#22D3EE" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1;1;0;0" dur="0.8s" fill="freeze" begin="1s" keyTimes="0;0.1;0.5;0.51;1"/>
|
||||
<animate attributeName="x" values="280;980" dur="1s" fill="freeze" begin="1s" calcMode="spline" keySplines="0.25 0.1 0.25 1"/>
|
||||
</rect>
|
||||
|
||||
<!-- Underline -->
|
||||
<line x1="280" y1="195" x2="280" y2="195" stroke="url(#hpUnderlineGrad)" stroke-width="3" stroke-linecap="round" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0.7" dur="0.1s" fill="freeze" begin="1.4s"/>
|
||||
<animate attributeName="x2" values="280;750" dur="0.8s" fill="freeze" begin="1.4s" calcMode="spline" keySplines="0.25 0.1 0.25 1"/>
|
||||
</line>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 11 KiB |
64
assets/logos/stratumiops-icon-dark-static.svg
Normal file
@ -0,0 +1,64 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
|
||||
<defs>
|
||||
<linearGradient id="sdLayerGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="100%" style="stop-color:#4F46E5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="sdProcessorGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#06B6D4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="sdFlowGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
</linearGradient>
|
||||
<filter id="sdProcessorGlow" x="-30%" y="-30%" width="160%" height="160%">
|
||||
<feGaussianBlur stdDeviation="10" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter id="sdNodeGlow" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="4" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
</defs>
|
||||
|
||||
<!-- Dark background -->
|
||||
<rect width="512" height="512" rx="96" fill="#0F172A"/>
|
||||
|
||||
<!-- Layers -->
|
||||
<rect x="80" y="115" width="352" height="48" rx="10" fill="url(#sdLayerGrad)" opacity="0.75"/>
|
||||
<rect x="80" y="232" width="352" height="48" rx="10" fill="url(#sdLayerGrad)"/>
|
||||
<rect x="80" y="349" width="352" height="48" rx="10" fill="url(#sdLayerGrad)" opacity="0.75"/>
|
||||
|
||||
<!-- Flows -->
|
||||
<path d="M130 163 Q130 200 190 230 Q230 250 230 256" stroke="url(#sdFlowGrad)" stroke-width="4" fill="none" opacity="0.7" stroke-linecap="round"/>
|
||||
<path d="M382 163 Q382 200 322 230 Q282 250 282 256" stroke="url(#sdFlowGrad)" stroke-width="4" fill="none" opacity="0.7" stroke-linecap="round"/>
|
||||
<path d="M230 256 Q230 262 190 282 Q130 312 130 349" stroke="url(#sdFlowGrad)" stroke-width="4" fill="none" opacity="0.7" stroke-linecap="round"/>
|
||||
<path d="M282 256 Q282 262 322 282 Q382 312 382 349" stroke="url(#sdFlowGrad)" stroke-width="4" fill="none" opacity="0.7" stroke-linecap="round"/>
|
||||
|
||||
<!-- I/O Points -->
|
||||
<circle cx="130" cy="139" r="11" fill="#22D3EE" filter="url(#sdNodeGlow)"/>
|
||||
<circle cx="382" cy="139" r="11" fill="#22D3EE" filter="url(#sdNodeGlow)"/>
|
||||
<circle cx="130" cy="373" r="11" fill="#6366F1" filter="url(#sdNodeGlow)"/>
|
||||
<circle cx="382" cy="373" r="11" fill="#6366F1" filter="url(#sdNodeGlow)"/>
|
||||
|
||||
<!-- Central processor -->
|
||||
<rect x="206" y="206" width="100" height="100" rx="18" fill="url(#sdProcessorGrad)" filter="url(#sdProcessorGlow)"/>
|
||||
<rect x="224" y="224" width="64" height="64" rx="10" fill="#ffffff" opacity="0.95"/>
|
||||
|
||||
<!-- Static equalizer bars -->
|
||||
<rect x="236" y="252" width="8" height="24" rx="2" fill="#22D3EE"/>
|
||||
<rect x="252" y="246" width="8" height="36" rx="2" fill="#06B6D4"/>
|
||||
<rect x="268" y="250" width="8" height="28" rx="2" fill="#22D3EE"/>
|
||||
|
||||
<!-- Indicators -->
|
||||
<circle cx="242" cy="240" r="4" fill="#22D3EE"/>
|
||||
<rect x="254" y="236" width="24" height="4" rx="2" fill="#06B6D4" opacity="0.8"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.2 KiB |
176
assets/logos/stratumiops-icon-dark.svg
Normal file
@ -0,0 +1,176 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
|
||||
<defs>
|
||||
<linearGradient id="hdLayerGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="100%" style="stop-color:#4F46E5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdProcessorGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#06B6D4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hdFlowGrad" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
<animate attributeName="x1" values="0%;100%;0%" dur="2.5s" repeatCount="indefinite"/>
|
||||
<animate attributeName="x2" values="100%;200%;100%" dur="2.5s" repeatCount="indefinite"/>
|
||||
</linearGradient>
|
||||
<filter id="hdProcessorGlow" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="10" result="coloredBlur">
|
||||
<animate attributeName="stdDeviation" values="8;14;8" dur="1.5s" repeatCount="indefinite"/>
|
||||
</feGaussianBlur>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter id="hdNodeGlow" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="5" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter id="hdBgGlow" x="-20%" y="-20%" width="140%" height="140%">
|
||||
<feGaussianBlur stdDeviation="30" result="blur"/>
|
||||
<feComposite in="SourceGraphic" in2="blur" operator="over"/>
|
||||
</filter>
|
||||
|
||||
<path id="hdPathIn1" d="M110 155 Q110 195 170 220 Q220 245 220 256" fill="none"/>
|
||||
<path id="hdPathIn2" d="M402 155 Q402 195 342 220 Q292 245 292 256" fill="none"/>
|
||||
<path id="hdPathOut1" d="M220 256 Q220 267 170 292 Q110 317 110 357" fill="none"/>
|
||||
<path id="hdPathOut2" d="M292 256 Q292 267 342 292 Q402 317 402 357" fill="none"/>
|
||||
</defs>
|
||||
|
||||
<!-- Dark background -->
|
||||
<rect width="512" height="512" rx="96" fill="#0F172A"/>
|
||||
|
||||
<!-- Ambient glow -->
|
||||
<ellipse cx="256" cy="256" rx="140" ry="100" fill="#6366F1" opacity="0.08" filter="url(#hdBgGlow)">
|
||||
<animate attributeName="opacity" values="0.05;0.12;0.05" dur="4s" repeatCount="indefinite"/>
|
||||
</ellipse>
|
||||
|
||||
<!-- Layers -->
|
||||
<rect x="80" y="115" width="352" height="48" rx="10" fill="url(#hdLayerGrad)" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0.75" dur="0.4s" fill="freeze"/>
|
||||
<animate attributeName="opacity" values="0.6;0.85;0.6" dur="3s" repeatCount="indefinite" begin="1s"/>
|
||||
</rect>
|
||||
<rect x="80" y="232" width="352" height="48" rx="10" fill="url(#hdLayerGrad)" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.4s" fill="freeze" begin="0.15s"/>
|
||||
</rect>
|
||||
<rect x="80" y="349" width="352" height="48" rx="10" fill="url(#hdLayerGrad)" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0.75" dur="0.4s" fill="freeze" begin="0.3s"/>
|
||||
<animate attributeName="opacity" values="0.85;0.6;0.85" dur="3s" repeatCount="indefinite" begin="1s"/>
|
||||
</rect>
|
||||
|
||||
<!-- Flows -->
|
||||
<path d="M130 163 Q130 200 190 230 Q230 250 230 256" stroke="url(#hdFlowGrad)" stroke-width="4" fill="none" opacity="0" stroke-linecap="round">
|
||||
<animate attributeName="opacity" values="0;0.7" dur="0.3s" fill="freeze" begin="0.5s"/>
|
||||
</path>
|
||||
<path d="M382 163 Q382 200 322 230 Q282 250 282 256" stroke="url(#hdFlowGrad)" stroke-width="4" fill="none" opacity="0" stroke-linecap="round">
|
||||
<animate attributeName="opacity" values="0;0.7" dur="0.3s" fill="freeze" begin="0.6s"/>
|
||||
</path>
|
||||
<path d="M230 256 Q230 262 190 282 Q130 312 130 349" stroke="url(#hdFlowGrad)" stroke-width="4" fill="none" opacity="0" stroke-linecap="round">
|
||||
<animate attributeName="opacity" values="0;0.7" dur="0.3s" fill="freeze" begin="0.7s"/>
|
||||
</path>
|
||||
<path d="M282 256 Q282 262 322 282 Q382 312 382 349" stroke="url(#hdFlowGrad)" stroke-width="4" fill="none" opacity="0" stroke-linecap="round">
|
||||
<animate attributeName="opacity" values="0;0.7" dur="0.3s" fill="freeze" begin="0.8s"/>
|
||||
</path>
|
||||
|
||||
<!-- Particles -->
|
||||
<circle r="6" fill="#22D3EE" filter="url(#hdNodeGlow)">
|
||||
<animateMotion dur="1.3s" repeatCount="indefinite" begin="1.3s">
|
||||
<mpath href="#hdPathIn1"/>
|
||||
</animateMotion>
|
||||
<animate attributeName="opacity" values="1;0.6;0.2" dur="1.3s" repeatCount="indefinite" begin="1.3s"/>
|
||||
</circle>
|
||||
<circle r="6" fill="#22D3EE" filter="url(#hdNodeGlow)">
|
||||
<animateMotion dur="1.3s" repeatCount="indefinite" begin="1.7s">
|
||||
<mpath href="#hdPathIn2"/>
|
||||
</animateMotion>
|
||||
<animate attributeName="opacity" values="1;0.6;0.2" dur="1.3s" repeatCount="indefinite" begin="1.7s"/>
|
||||
</circle>
|
||||
<circle r="5" fill="#6366F1">
|
||||
<animateMotion dur="1.3s" repeatCount="indefinite" begin="2s">
|
||||
<mpath href="#hdPathOut1"/>
|
||||
</animateMotion>
|
||||
<animate attributeName="opacity" values="0.2;0.6;1" dur="1.3s" repeatCount="indefinite" begin="2s"/>
|
||||
</circle>
|
||||
<circle r="5" fill="#6366F1">
|
||||
<animateMotion dur="1.3s" repeatCount="indefinite" begin="2.3s">
|
||||
<mpath href="#hdPathOut2"/>
|
||||
</animateMotion>
|
||||
<animate attributeName="opacity" values="0.2;0.6;1" dur="1.3s" repeatCount="indefinite" begin="2.3s"/>
|
||||
</circle>
|
||||
|
||||
<!-- I/O Points -->
|
||||
<circle cx="130" cy="139" r="0" fill="#22D3EE" filter="url(#hdNodeGlow)">
|
||||
<animate attributeName="r" values="0;11" dur="0.25s" fill="freeze" begin="0.2s"/>
|
||||
<animate attributeName="r" values="10;13;10" dur="2s" repeatCount="indefinite" begin="1.2s"/>
|
||||
</circle>
|
||||
<circle cx="382" cy="139" r="0" fill="#22D3EE" filter="url(#hdNodeGlow)">
|
||||
<animate attributeName="r" values="0;11" dur="0.25s" fill="freeze" begin="0.25s"/>
|
||||
<animate attributeName="r" values="11;10;11" dur="2s" repeatCount="indefinite" begin="1.2s"/>
|
||||
</circle>
|
||||
<circle cx="130" cy="373" r="0" fill="#6366F1" filter="url(#hdNodeGlow)">
|
||||
<animate attributeName="r" values="0;11" dur="0.25s" fill="freeze" begin="0.35s"/>
|
||||
<animate attributeName="r" values="10;13;10" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
</circle>
|
||||
<circle cx="382" cy="373" r="0" fill="#6366F1" filter="url(#hdNodeGlow)">
|
||||
<animate attributeName="r" values="0;11" dur="0.25s" fill="freeze" begin="0.4s"/>
|
||||
<animate attributeName="r" values="11;10;11" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
</circle>
|
||||
|
||||
<!-- Central processor -->
|
||||
<rect x="206" y="206" width="100" height="100" rx="18" fill="url(#hdProcessorGrad)" filter="url(#hdProcessorGlow)" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.4s" fill="freeze" begin="0.45s"/>
|
||||
</rect>
|
||||
<rect x="224" y="224" width="64" height="64" rx="10" fill="#ffffff" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0.95" dur="0.3s" fill="freeze" begin="0.6s"/>
|
||||
</rect>
|
||||
|
||||
<!-- Equalizer bars -->
|
||||
<rect x="236" y="258" width="8" height="18" rx="2" fill="#22D3EE" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.2s" fill="freeze" begin="0.8s"/>
|
||||
<animate attributeName="height" values="18;30;12;24;18" dur="0.6s" repeatCount="indefinite" begin="1.2s"/>
|
||||
<animate attributeName="y" values="258;252;264;256;258" dur="0.6s" repeatCount="indefinite" begin="1.2s"/>
|
||||
</rect>
|
||||
<rect x="252" y="250" width="8" height="34" rx="2" fill="#06B6D4" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.2s" fill="freeze" begin="0.85s"/>
|
||||
<animate attributeName="height" values="34;16;28;40;34" dur="0.55s" repeatCount="indefinite" begin="1.25s"/>
|
||||
<animate attributeName="y" values="250;262;254;246;250" dur="0.55s" repeatCount="indefinite" begin="1.25s"/>
|
||||
</rect>
|
||||
<rect x="268" y="254" width="8" height="26" rx="2" fill="#22D3EE" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.2s" fill="freeze" begin="0.9s"/>
|
||||
<animate attributeName="height" values="26;38;20;32;26" dur="0.5s" repeatCount="indefinite" begin="1.3s"/>
|
||||
<animate attributeName="y" values="254;248;260;252;254" dur="0.5s" repeatCount="indefinite" begin="1.3s"/>
|
||||
</rect>
|
||||
|
||||
<!-- Indicators -->
|
||||
<circle cx="242" cy="240" r="4" fill="#22D3EE" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.2s" fill="freeze" begin="0.95s"/>
|
||||
<animate attributeName="opacity" values="1;0.3;1" dur="0.8s" repeatCount="indefinite" begin="1.2s"/>
|
||||
</circle>
|
||||
<rect x="254" y="236" width="24" height="4" rx="2" fill="#06B6D4" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0.7" dur="0.2s" fill="freeze" begin="1s"/>
|
||||
<animate attributeName="width" values="24;12;24;18;24" dur="1s" repeatCount="indefinite" begin="1.3s"/>
|
||||
</rect>
|
||||
|
||||
<!-- Processor pulse -->
|
||||
<rect x="206" y="206" width="100" height="100" rx="18" fill="none" stroke="#22D3EE" stroke-width="2" opacity="0">
|
||||
<animate attributeName="x" values="206;176" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="y" values="206;176" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="width" values="100;160" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="height" values="100;160" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="rx" values="18;28" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="opacity" values="0.6;0" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
</rect>
|
||||
|
||||
<!-- Flashes -->
|
||||
<circle cx="150" cy="145" r="2" fill="#22D3EE" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0.9;0" dur="3s" repeatCount="indefinite" begin="1s"/>
|
||||
</circle>
|
||||
<circle cx="362" cy="367" r="2" fill="#22D3EE" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0.9;0" dur="3s" repeatCount="indefinite" begin="2s"/>
|
||||
</circle>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.8 KiB |
61
assets/logos/stratumiops-icon-static.svg
Normal file
@ -0,0 +1,61 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
|
||||
<defs>
|
||||
<linearGradient id="sLayerGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="100%" style="stop-color:#4F46E5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="sProcessorGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#06B6D4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="sFlowGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
</linearGradient>
|
||||
<filter id="sProcessorGlow" x="-30%" y="-30%" width="160%" height="160%">
|
||||
<feGaussianBlur stdDeviation="8" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter id="sNodeGlow" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="3" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
</defs>
|
||||
|
||||
<!-- Layers -->
|
||||
<rect x="80" y="115" width="352" height="48" rx="10" fill="url(#sLayerGrad)" opacity="0.7"/>
|
||||
<rect x="80" y="232" width="352" height="48" rx="10" fill="url(#sLayerGrad)"/>
|
||||
<rect x="80" y="349" width="352" height="48" rx="10" fill="url(#sLayerGrad)" opacity="0.7"/>
|
||||
|
||||
<!-- Flows -->
|
||||
<path d="M130 163 Q130 200 190 230 Q230 250 230 256" stroke="url(#sFlowGrad)" stroke-width="4" fill="none" opacity="0.6" stroke-linecap="round"/>
|
||||
<path d="M382 163 Q382 200 322 230 Q282 250 282 256" stroke="url(#sFlowGrad)" stroke-width="4" fill="none" opacity="0.6" stroke-linecap="round"/>
|
||||
<path d="M230 256 Q230 262 190 282 Q130 312 130 349" stroke="url(#sFlowGrad)" stroke-width="4" fill="none" opacity="0.6" stroke-linecap="round"/>
|
||||
<path d="M282 256 Q282 262 322 282 Q382 312 382 349" stroke="url(#sFlowGrad)" stroke-width="4" fill="none" opacity="0.6" stroke-linecap="round"/>
|
||||
|
||||
<!-- I/O Points -->
|
||||
<circle cx="130" cy="139" r="10" fill="#22D3EE" filter="url(#sNodeGlow)"/>
|
||||
<circle cx="382" cy="139" r="10" fill="#22D3EE" filter="url(#sNodeGlow)"/>
|
||||
<circle cx="130" cy="373" r="10" fill="#6366F1" filter="url(#sNodeGlow)"/>
|
||||
<circle cx="382" cy="373" r="10" fill="#6366F1" filter="url(#sNodeGlow)"/>
|
||||
|
||||
<!-- Central processor -->
|
||||
<rect x="206" y="206" width="100" height="100" rx="18" fill="url(#sProcessorGrad)" filter="url(#sProcessorGlow)"/>
|
||||
<rect x="224" y="224" width="64" height="64" rx="10" fill="#ffffff" opacity="0.95"/>
|
||||
|
||||
<!-- Static equalizer bars -->
|
||||
<rect x="236" y="252" width="8" height="24" rx="2" fill="#22D3EE"/>
|
||||
<rect x="252" y="246" width="8" height="36" rx="2" fill="#06B6D4"/>
|
||||
<rect x="268" y="250" width="8" height="28" rx="2" fill="#22D3EE"/>
|
||||
|
||||
<!-- Indicators -->
|
||||
<circle cx="242" cy="240" r="4" fill="#22D3EE"/>
|
||||
<rect x="254" y="236" width="24" height="4" rx="2" fill="#06B6D4" opacity="0.8"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.1 KiB |
177
assets/logos/stratumiops-icon.svg
Normal file
@ -0,0 +1,177 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
|
||||
<defs>
|
||||
<linearGradient id="hybridLayerGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="100%" style="stop-color:#4F46E5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hybridProcessorGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#06B6D4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="hybridFlowGrad" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
<animate attributeName="x1" values="0%;100%;0%" dur="2.5s" repeatCount="indefinite"/>
|
||||
<animate attributeName="x2" values="100%;200%;100%" dur="2.5s" repeatCount="indefinite"/>
|
||||
</linearGradient>
|
||||
<filter id="hybridProcessorGlow" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="8" result="coloredBlur">
|
||||
<animate attributeName="stdDeviation" values="6;12;6" dur="1.5s" repeatCount="indefinite"/>
|
||||
</feGaussianBlur>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter id="hybridNodeGlow" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="4" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<!-- Paths for particles -->
|
||||
<path id="hybridPathIn1" d="M110 155 Q110 195 170 220 Q220 245 220 256" fill="none"/>
|
||||
<path id="hybridPathIn2" d="M402 155 Q402 195 342 220 Q292 245 292 256" fill="none"/>
|
||||
<path id="hybridPathOut1" d="M220 256 Q220 267 170 292 Q110 317 110 357" fill="none"/>
|
||||
<path id="hybridPathOut2" d="M292 256 Q292 267 342 292 Q402 317 402 357" fill="none"/>
|
||||
</defs>
|
||||
|
||||
<!-- Upper layer (V1 style) -->
|
||||
<rect x="80" y="115" width="352" height="48" rx="10" fill="url(#hybridLayerGrad)" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0.7" dur="0.4s" fill="freeze"/>
|
||||
<animate attributeName="opacity" values="0.5;0.8;0.5" dur="3s" repeatCount="indefinite" begin="1s"/>
|
||||
</rect>
|
||||
|
||||
<!-- Middle layer (V1 style) -->
|
||||
<rect x="80" y="232" width="352" height="48" rx="10" fill="url(#hybridLayerGrad)" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.4s" fill="freeze" begin="0.15s"/>
|
||||
</rect>
|
||||
|
||||
<!-- Lower layer (V1 style) -->
|
||||
<rect x="80" y="349" width="352" height="48" rx="10" fill="url(#hybridLayerGrad)" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0.7" dur="0.4s" fill="freeze" begin="0.3s"/>
|
||||
<animate attributeName="opacity" values="0.8;0.5;0.8" dur="3s" repeatCount="indefinite" begin="1s"/>
|
||||
</rect>
|
||||
|
||||
<!-- Curved connection flows (V5 style) -->
|
||||
<path d="M130 163 Q130 200 190 230 Q230 250 230 256" stroke="url(#hybridFlowGrad)" stroke-width="4" fill="none" opacity="0" stroke-linecap="round">
|
||||
<animate attributeName="opacity" values="0;0.65" dur="0.3s" fill="freeze" begin="0.5s"/>
|
||||
</path>
|
||||
<path d="M382 163 Q382 200 322 230 Q282 250 282 256" stroke="url(#hybridFlowGrad)" stroke-width="4" fill="none" opacity="0" stroke-linecap="round">
|
||||
<animate attributeName="opacity" values="0;0.65" dur="0.3s" fill="freeze" begin="0.6s"/>
|
||||
</path>
|
||||
<path d="M230 256 Q230 262 190 282 Q130 312 130 349" stroke="url(#hybridFlowGrad)" stroke-width="4" fill="none" opacity="0" stroke-linecap="round">
|
||||
<animate attributeName="opacity" values="0;0.65" dur="0.3s" fill="freeze" begin="0.7s"/>
|
||||
</path>
|
||||
<path d="M282 256 Q282 262 322 282 Q382 312 382 349" stroke="url(#hybridFlowGrad)" stroke-width="4" fill="none" opacity="0" stroke-linecap="round">
|
||||
<animate attributeName="opacity" values="0;0.65" dur="0.3s" fill="freeze" begin="0.8s"/>
|
||||
</path>
|
||||
|
||||
<!-- Incoming data particles -->
|
||||
<circle r="6" fill="#22D3EE" filter="url(#hybridNodeGlow)">
|
||||
<animateMotion dur="1.3s" repeatCount="indefinite" begin="1.3s">
|
||||
<mpath href="#hybridPathIn1"/>
|
||||
</animateMotion>
|
||||
<animate attributeName="opacity" values="1;0.6;0.2" dur="1.3s" repeatCount="indefinite" begin="1.3s"/>
|
||||
</circle>
|
||||
<circle r="6" fill="#22D3EE" filter="url(#hybridNodeGlow)">
|
||||
<animateMotion dur="1.3s" repeatCount="indefinite" begin="1.7s">
|
||||
<mpath href="#hybridPathIn2"/>
|
||||
</animateMotion>
|
||||
<animate attributeName="opacity" values="1;0.6;0.2" dur="1.3s" repeatCount="indefinite" begin="1.7s"/>
|
||||
</circle>
|
||||
|
||||
<!-- Outgoing data particles -->
|
||||
<circle r="5" fill="#6366F1">
|
||||
<animateMotion dur="1.3s" repeatCount="indefinite" begin="2s">
|
||||
<mpath href="#hybridPathOut1"/>
|
||||
</animateMotion>
|
||||
<animate attributeName="opacity" values="0.2;0.6;1" dur="1.3s" repeatCount="indefinite" begin="2s"/>
|
||||
</circle>
|
||||
<circle r="5" fill="#6366F1">
|
||||
<animateMotion dur="1.3s" repeatCount="indefinite" begin="2.3s">
|
||||
<mpath href="#hybridPathOut2"/>
|
||||
</animateMotion>
|
||||
<animate attributeName="opacity" values="0.2;0.6;1" dur="1.3s" repeatCount="indefinite" begin="2.3s"/>
|
||||
</circle>
|
||||
|
||||
<!-- Input points (cyan) -->
|
||||
<circle cx="130" cy="139" r="0" fill="#22D3EE" filter="url(#hybridNodeGlow)">
|
||||
<animate attributeName="r" values="0;10" dur="0.25s" fill="freeze" begin="0.2s"/>
|
||||
<animate attributeName="r" values="9;12;9" dur="2s" repeatCount="indefinite" begin="1.2s"/>
|
||||
</circle>
|
||||
<circle cx="382" cy="139" r="0" fill="#22D3EE" filter="url(#hybridNodeGlow)">
|
||||
<animate attributeName="r" values="0;10" dur="0.25s" fill="freeze" begin="0.25s"/>
|
||||
<animate attributeName="r" values="10;9;10" dur="2s" repeatCount="indefinite" begin="1.2s"/>
|
||||
</circle>
|
||||
|
||||
<!-- Output points (indigo) -->
|
||||
<circle cx="130" cy="373" r="0" fill="#6366F1" filter="url(#hybridNodeGlow)">
|
||||
<animate attributeName="r" values="0;10" dur="0.25s" fill="freeze" begin="0.35s"/>
|
||||
<animate attributeName="r" values="9;12;9" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
</circle>
|
||||
<circle cx="382" cy="373" r="0" fill="#6366F1" filter="url(#hybridNodeGlow)">
|
||||
<animate attributeName="r" values="0;10" dur="0.25s" fill="freeze" begin="0.4s"/>
|
||||
<animate attributeName="r" values="10;9;10" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
</circle>
|
||||
|
||||
<!-- ═══════════════════════════════════════════════ -->
|
||||
<!-- CENTRAL PROCESSOR (V5 style) -->
|
||||
<!-- ═══════════════════════════════════════════════ -->
|
||||
|
||||
<!-- External processor box with glow -->
|
||||
<rect x="206" y="206" width="100" height="100" rx="18" fill="url(#hybridProcessorGrad)" filter="url(#hybridProcessorGlow)" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.4s" fill="freeze" begin="0.45s"/>
|
||||
</rect>
|
||||
|
||||
<!-- White inner box -->
|
||||
<rect x="224" y="224" width="64" height="64" rx="10" fill="#ffffff" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0.95" dur="0.3s" fill="freeze" begin="0.6s"/>
|
||||
</rect>
|
||||
|
||||
<!-- Processing indicators (equalizer bars) -->
|
||||
<rect x="236" y="258" width="8" height="18" rx="2" fill="#22D3EE" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.2s" fill="freeze" begin="0.8s"/>
|
||||
<animate attributeName="height" values="18;30;12;24;18" dur="0.6s" repeatCount="indefinite" begin="1.2s"/>
|
||||
<animate attributeName="y" values="258;252;264;256;258" dur="0.6s" repeatCount="indefinite" begin="1.2s"/>
|
||||
</rect>
|
||||
<rect x="252" y="250" width="8" height="34" rx="2" fill="#06B6D4" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.2s" fill="freeze" begin="0.85s"/>
|
||||
<animate attributeName="height" values="34;16;28;40;34" dur="0.55s" repeatCount="indefinite" begin="1.25s"/>
|
||||
<animate attributeName="y" values="250;262;254;246;250" dur="0.55s" repeatCount="indefinite" begin="1.25s"/>
|
||||
</rect>
|
||||
<rect x="268" y="254" width="8" height="26" rx="2" fill="#22D3EE" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.2s" fill="freeze" begin="0.9s"/>
|
||||
<animate attributeName="height" values="26;38;20;32;26" dur="0.5s" repeatCount="indefinite" begin="1.3s"/>
|
||||
<animate attributeName="y" values="254;248;260;252;254" dur="0.5s" repeatCount="indefinite" begin="1.3s"/>
|
||||
</rect>
|
||||
|
||||
<!-- Small status indicator (blinking dot) -->
|
||||
<circle cx="242" cy="240" r="4" fill="#22D3EE" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.2s" fill="freeze" begin="0.95s"/>
|
||||
<animate attributeName="opacity" values="1;0.3;1" dur="0.8s" repeatCount="indefinite" begin="1.2s"/>
|
||||
</circle>
|
||||
|
||||
<!-- Active connection indicator -->
|
||||
<rect x="254" y="236" width="24" height="4" rx="2" fill="#06B6D4" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0.7" dur="0.2s" fill="freeze" begin="1s"/>
|
||||
<animate attributeName="width" values="24;12;24;18;24" dur="1s" repeatCount="indefinite" begin="1.3s"/>
|
||||
</rect>
|
||||
|
||||
<!-- ═══════════════════════════════════════════════ -->
|
||||
<!-- ADDITIONAL EFFECTS -->
|
||||
<!-- ═══════════════════════════════════════════════ -->
|
||||
|
||||
<!-- Pulse from the processor -->
|
||||
<rect x="206" y="206" width="100" height="100" rx="18" fill="none" stroke="#22D3EE" stroke-width="2" opacity="0">
|
||||
<animate attributeName="x" values="206;176" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="y" values="206;176" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="width" values="100;160" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="height" values="100;160" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="rx" values="18;28" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="opacity" values="0.5;0" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
</rect>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 10 KiB |
42
assets/logos/stratumiops-mono-black-h.svg
Normal file
@ -0,0 +1,42 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 300" width="800" height="300">
|
||||
<defs>
|
||||
<style>
|
||||
.mono-wordmark { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; font-weight: 700; }
|
||||
</style>
|
||||
</defs>
|
||||
|
||||
<!-- Logo Icon -->
|
||||
<g transform="translate(20, 50)">
|
||||
<!-- Layers -->
|
||||
<rect x="0" y="18" width="220" height="24" rx="5" fill="#1a1a2e" opacity="0.5"/>
|
||||
<rect x="0" y="88" width="220" height="24" rx="5" fill="#1a1a2e"/>
|
||||
<rect x="0" y="158" width="220" height="24" rx="5" fill="#1a1a2e" opacity="0.5"/>
|
||||
|
||||
<!-- Flows -->
|
||||
<path d="M35 42 Q35 65 70 85 Q95 100 95 100" stroke="#1a1a2e" stroke-width="3" fill="none" opacity="0.4" stroke-linecap="round"/>
|
||||
<path d="M185 42 Q185 65 150 85 Q125 100 125 100" stroke="#1a1a2e" stroke-width="3" fill="none" opacity="0.4" stroke-linecap="round"/>
|
||||
<path d="M95 100 Q95 100 70 115 Q35 135 35 158" stroke="#1a1a2e" stroke-width="3" fill="none" opacity="0.4" stroke-linecap="round"/>
|
||||
<path d="M125 100 Q125 100 150 115 Q185 135 185 158" stroke="#1a1a2e" stroke-width="3" fill="none" opacity="0.4" stroke-linecap="round"/>
|
||||
|
||||
<!-- I/O Points -->
|
||||
<circle cx="35" cy="30" r="6" fill="#1a1a2e" opacity="0.7"/>
|
||||
<circle cx="185" cy="30" r="6" fill="#1a1a2e" opacity="0.7"/>
|
||||
<circle cx="35" cy="170" r="6" fill="#1a1a2e" opacity="0.5"/>
|
||||
<circle cx="185" cy="170" r="6" fill="#1a1a2e" opacity="0.5"/>
|
||||
|
||||
<!-- Central processor -->
|
||||
<rect x="85" y="75" width="50" height="50" rx="9" fill="#1a1a2e"/>
|
||||
<rect x="97" y="87" width="26" height="26" rx="5" fill="#ffffff"/>
|
||||
|
||||
<!-- Equalizer bars -->
|
||||
<rect x="101" y="93" width="4" height="11" rx="1" fill="#1a1a2e"/>
|
||||
<rect x="108" y="91" width="4" height="15" rx="1" fill="#1a1a2e"/>
|
||||
<rect x="115" y="94" width="4" height="9" rx="1" fill="#1a1a2e"/>
|
||||
</g>
|
||||
|
||||
<!-- Wordmark -->
|
||||
<text x="280" y="175" class="mono-wordmark" font-size="72" fill="#1a1a2e">StratumIOps</text>
|
||||
|
||||
<!-- Underline -->
|
||||
<line x1="280" y1="195" x2="750" y2="195" stroke="#1a1a2e" stroke-width="3" stroke-linecap="round" opacity="0.4"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
46
assets/logos/stratumiops-mono-black-v.svg
Normal file
@ -0,0 +1,46 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 520" width="400" height="520">
|
||||
<defs>
|
||||
<style>
|
||||
.mono-wordmark { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; font-weight: 700; }
|
||||
</style>
|
||||
</defs>
|
||||
|
||||
<!-- Centered Logo Icon -->
|
||||
<g transform="translate(0, 25)">
|
||||
<!-- Layers -->
|
||||
<rect x="50" y="15" width="300" height="32" rx="6" fill="#1a1a2e" opacity="0.5"/>
|
||||
<rect x="50" y="124" width="300" height="32" rx="6" fill="#1a1a2e"/>
|
||||
<rect x="50" y="233" width="300" height="32" rx="6" fill="#1a1a2e" opacity="0.5"/>
|
||||
|
||||
<!-- Flows -->
|
||||
<path d="M85 47 Q85 80 135 110 Q175 135 175 140" stroke="#1a1a2e" stroke-width="4" fill="none" opacity="0.4" stroke-linecap="round"/>
|
||||
<path d="M315 47 Q315 80 265 110 Q225 135 225 140" stroke="#1a1a2e" stroke-width="4" fill="none" opacity="0.4" stroke-linecap="round"/>
|
||||
<path d="M175 140 Q175 145 135 170 Q85 200 85 233" stroke="#1a1a2e" stroke-width="4" fill="none" opacity="0.4" stroke-linecap="round"/>
|
||||
<path d="M225 140 Q225 145 265 170 Q315 200 315 233" stroke="#1a1a2e" stroke-width="4" fill="none" opacity="0.4" stroke-linecap="round"/>
|
||||
|
||||
<!-- I/O Points -->
|
||||
<circle cx="85" cy="31" r="8" fill="#1a1a2e" opacity="0.7"/>
|
||||
<circle cx="315" cy="31" r="8" fill="#1a1a2e" opacity="0.7"/>
|
||||
<circle cx="85" cy="249" r="8" fill="#1a1a2e" opacity="0.5"/>
|
||||
<circle cx="315" cy="249" r="8" fill="#1a1a2e" opacity="0.5"/>
|
||||
|
||||
<!-- Central processor -->
|
||||
<rect x="160" y="100" width="80" height="80" rx="14" fill="#1a1a2e"/>
|
||||
<rect x="176" y="116" width="48" height="48" rx="8" fill="#ffffff"/>
|
||||
|
||||
<!-- Equalizer bars -->
|
||||
<rect x="185" y="130" width="6" height="18" rx="2" fill="#1a1a2e"/>
|
||||
<rect x="197" y="125" width="6" height="28" rx="2" fill="#1a1a2e"/>
|
||||
<rect x="209" y="128" width="6" height="22" rx="2" fill="#1a1a2e"/>
|
||||
</g>
|
||||
|
||||
<!-- Wordmark -->
|
||||
<text x="200" y="365" class="mono-wordmark" font-size="48" fill="#1a1a2e" text-anchor="middle">StratumIOps</text>
|
||||
|
||||
<!-- Subtítulo
|
||||
<text x="200" y="405" font-family="Inter, sans-serif" font-size="14" fill="#1a1a2e" text-anchor="middle" opacity="0.6" font-weight="500">Intelligent Infrastructure Operations</text>
|
||||
-->
|
||||
|
||||
<!-- Underline -->
|
||||
<line x1="45" y1="385" x2="355" y2="385" stroke="#1a1a2e" stroke-width="3" stroke-linecap="round" opacity="0.4"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
42
assets/logos/stratumiops-mono-white-h.svg
Normal file
@ -0,0 +1,42 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 300" width="800" height="300">
|
||||
<defs>
|
||||
<style>
|
||||
.mono-wordmark { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; font-weight: 700; }
|
||||
</style>
|
||||
</defs>
|
||||
|
||||
<!-- Logo Icon -->
|
||||
<g transform="translate(20, 50)">
|
||||
<!-- Layers -->
|
||||
<rect x="0" y="18" width="220" height="24" rx="5" fill="#ffffff" opacity="0.6"/>
|
||||
<rect x="0" y="88" width="220" height="24" rx="5" fill="#ffffff"/>
|
||||
<rect x="0" y="158" width="220" height="24" rx="5" fill="#ffffff" opacity="0.6"/>
|
||||
|
||||
<!-- Flows -->
|
||||
<path d="M35 42 Q35 65 70 85 Q95 100 95 100" stroke="#ffffff" stroke-width="3" fill="none" opacity="0.5" stroke-linecap="round"/>
|
||||
<path d="M185 42 Q185 65 150 85 Q125 100 125 100" stroke="#ffffff" stroke-width="3" fill="none" opacity="0.5" stroke-linecap="round"/>
|
||||
<path d="M95 100 Q95 100 70 115 Q35 135 35 158" stroke="#ffffff" stroke-width="3" fill="none" opacity="0.5" stroke-linecap="round"/>
|
||||
<path d="M125 100 Q125 100 150 115 Q185 135 185 158" stroke="#ffffff" stroke-width="3" fill="none" opacity="0.5" stroke-linecap="round"/>
|
||||
|
||||
<!-- I/O Points -->
|
||||
<circle cx="35" cy="30" r="6" fill="#ffffff" opacity="0.8"/>
|
||||
<circle cx="185" cy="30" r="6" fill="#ffffff" opacity="0.8"/>
|
||||
<circle cx="35" cy="170" r="6" fill="#ffffff" opacity="0.6"/>
|
||||
<circle cx="185" cy="170" r="6" fill="#ffffff" opacity="0.6"/>
|
||||
|
||||
<!-- Central processor -->
|
||||
<rect x="85" y="75" width="50" height="50" rx="9" fill="#ffffff"/>
|
||||
<rect x="97" y="87" width="26" height="26" rx="5" fill="#000000" opacity="0.15"/>
|
||||
|
||||
<!-- Equalizer bars -->
|
||||
<rect x="101" y="93" width="4" height="11" rx="1" fill="#ffffff"/>
|
||||
<rect x="108" y="91" width="4" height="15" rx="1" fill="#ffffff"/>
|
||||
<rect x="115" y="94" width="4" height="9" rx="1" fill="#ffffff"/>
|
||||
</g>
|
||||
|
||||
<!-- Wordmark -->
|
||||
<text x="280" y="175" class="mono-wordmark" font-size="72" fill="#ffffff">StratumIOps</text>
|
||||
|
||||
<!-- Underline -->
|
||||
<line x1="280" y1="195" x2="750" y2="195" stroke="#ffffff" stroke-width="3" stroke-linecap="round" opacity="0.5"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
46
assets/logos/stratumiops-mono-white-v.svg
Normal file
@ -0,0 +1,46 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 520" width="400" height="520">
|
||||
<defs>
|
||||
<style>
|
||||
.mono-wordmark { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; font-weight: 700; }
|
||||
</style>
|
||||
</defs>
|
||||
|
||||
<!-- Centered Logo Icon -->
|
||||
<g transform="translate(0, 25)">
|
||||
<!-- Layers -->
|
||||
<rect x="50" y="15" width="300" height="32" rx="6" fill="#ffffff" opacity="0.6"/>
|
||||
<rect x="50" y="124" width="300" height="32" rx="6" fill="#ffffff"/>
|
||||
<rect x="50" y="233" width="300" height="32" rx="6" fill="#ffffff" opacity="0.6"/>
|
||||
|
||||
<!-- Flows -->
|
||||
<path d="M85 47 Q85 80 135 110 Q175 135 175 140" stroke="#ffffff" stroke-width="4" fill="none" opacity="0.5" stroke-linecap="round"/>
|
||||
<path d="M315 47 Q315 80 265 110 Q225 135 225 140" stroke="#ffffff" stroke-width="4" fill="none" opacity="0.5" stroke-linecap="round"/>
|
||||
<path d="M175 140 Q175 145 135 170 Q85 200 85 233" stroke="#ffffff" stroke-width="4" fill="none" opacity="0.5" stroke-linecap="round"/>
|
||||
<path d="M225 140 Q225 145 265 170 Q315 200 315 233" stroke="#ffffff" stroke-width="4" fill="none" opacity="0.5" stroke-linecap="round"/>
|
||||
|
||||
<!-- I/O Points -->
|
||||
<circle cx="85" cy="31" r="8" fill="#ffffff" opacity="0.8"/>
|
||||
<circle cx="315" cy="31" r="8" fill="#ffffff" opacity="0.8"/>
|
||||
<circle cx="85" cy="249" r="8" fill="#ffffff" opacity="0.6"/>
|
||||
<circle cx="315" cy="249" r="8" fill="#ffffff" opacity="0.6"/>
|
||||
|
||||
<!-- Central processor -->
|
||||
<rect x="160" y="100" width="80" height="80" rx="14" fill="#ffffff"/>
|
||||
<rect x="176" y="116" width="48" height="48" rx="8" fill="#000000" opacity="0.15"/>
|
||||
|
||||
<!-- Equalizer bars -->
|
||||
<rect x="185" y="130" width="6" height="18" rx="2" fill="#ffffff"/>
|
||||
<rect x="197" y="125" width="6" height="28" rx="2" fill="#ffffff"/>
|
||||
<rect x="209" y="128" width="6" height="22" rx="2" fill="#ffffff"/>
|
||||
</g>
|
||||
|
||||
<!-- Wordmark -->
|
||||
<text x="200" y="365" class="mono-wordmark" font-size="48" fill="#ffffff" text-anchor="middle">StratumIOps</text>
|
||||
|
||||
<!-- Subtitle
|
||||
<text x="200" y="405" font-family="Inter, sans-serif" font-size="14" fill="#ffffff" text-anchor="middle" opacity="0.6" font-weight="500">Intelligent Infrastructure Operations</text>
|
||||
-->
|
||||
|
||||
<!-- Underline -->
|
||||
<line x1="45" y1="385" x2="355" y2="385" stroke="#ffffff" stroke-width="3" stroke-linecap="round" opacity="0.5"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
84
assets/logos/stratumiops-social-square-dark.svg
Normal file
@ -0,0 +1,84 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1080 1080" width="1080" height="1080">
|
||||
<defs>
|
||||
<linearGradient id="smLayerGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="100%" style="stop-color:#4F46E5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="smProcessorGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#06B6D4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="smFlowGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="smUnderlineGrad" x1="240" y1="910" x2="840" y2="910" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
</linearGradient>
|
||||
<filter id="smProcessorGlow" x="-40%" y="-40%" width="180%" height="180%">
|
||||
<feGaussianBlur stdDeviation="12" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter id="smNodeGlow" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="6" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<style>
|
||||
.sm-wordmark { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; font-weight: 700; }
|
||||
</style>
|
||||
</defs>
|
||||
|
||||
<!-- Dark background -->
|
||||
<rect width="1080" height="1080" fill="#0F172A"/>
|
||||
|
||||
<!-- Centered Logo Icon with padding -->
|
||||
<g transform="translate(190, 180)">
|
||||
<!-- Layers -->
|
||||
<rect x="0" y="30" width="700" height="70" rx="14" fill="url(#smLayerGrad)" opacity="0.75"/>
|
||||
<rect x="0" y="265" width="700" height="70" rx="14" fill="url(#smLayerGrad)"/>
|
||||
<rect x="0" y="500" width="700" height="70" rx="14" fill="url(#smLayerGrad)" opacity="0.75"/>
|
||||
|
||||
<!-- Flows -->
|
||||
<path d="M100 100 Q100 180 220 240 Q320 290 320 300" stroke="url(#smFlowGrad)" stroke-width="8" fill="none" opacity="0.7" stroke-linecap="round"/>
|
||||
<path d="M600 100 Q600 180 480 240 Q380 290 380 300" stroke="url(#smFlowGrad)" stroke-width="8" fill="none" opacity="0.7" stroke-linecap="round"/>
|
||||
<path d="M320 300 Q320 310 220 360 Q100 420 100 500" stroke="url(#smFlowGrad)" stroke-width="8" fill="none" opacity="0.7" stroke-linecap="round"/>
|
||||
<path d="M380 300 Q380 310 480 360 Q600 420 600 500" stroke="url(#smFlowGrad)" stroke-width="8" fill="none" opacity="0.7" stroke-linecap="round"/>
|
||||
|
||||
<!-- I/O Points -->
|
||||
<circle cx="100" cy="65" r="18" fill="#22D3EE" filter="url(#smNodeGlow)"/>
|
||||
<circle cx="600" cy="65" r="18" fill="#22D3EE" filter="url(#smNodeGlow)"/>
|
||||
<circle cx="100" cy="535" r="18" fill="#6366F1" filter="url(#smNodeGlow)"/>
|
||||
<circle cx="600" cy="535" r="18" fill="#6366F1" filter="url(#smNodeGlow)"/>
|
||||
|
||||
<!-- Central processor -->
|
||||
<rect x="260" y="210" width="180" height="180" rx="32" fill="url(#smProcessorGrad)" filter="url(#smProcessorGlow)"/>
|
||||
<rect x="296" y="246" width="108" height="108" rx="18" fill="#ffffff" opacity="0.95"/>
|
||||
|
||||
<!-- Equalizer bars -->
|
||||
<rect x="316" y="280" width="14" height="40" rx="4" fill="#22D3EE"/>
|
||||
<rect x="343" y="268" width="14" height="64" rx="4" fill="#06B6D4"/>
|
||||
<rect x="370" y="274" width="14" height="52" rx="4" fill="#22D3EE"/>
|
||||
|
||||
<!-- Indicator -->
|
||||
<circle cx="326" cy="265" r="7" fill="#22D3EE"/>
|
||||
</g>
|
||||
|
||||
<!-- Wordmark -->
|
||||
<text x="540" y="880" class="sm-wordmark" font-size="90" fill="url(#smLayerGrad)" text-anchor="middle">Stratum<tspan fill="url(#smProcessorGrad)">I</tspan>Ops</text>
|
||||
|
||||
<!-- Subtitle
|
||||
<text x="540" y="960" font-family="Inter, sans-serif" font-size="28" fill="#6366F1" text-anchor="middle" opacity="0.7" font-weight="500">Intelligent Infrastructure Operations</text>
|
||||
-->
|
||||
|
||||
<!-- Underline -->
|
||||
<line x1="240" y1="910" x2="840" y2="910" stroke="url(#smUnderlineGrad)" stroke-width="6" stroke-linecap="round" opacity="0.7"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.2 KiB |
84
assets/logos/stratumiops-social-square-light.svg
Normal file
@ -0,0 +1,84 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1080 1080" width="1080" height="1080">
|
||||
<defs>
|
||||
<linearGradient id="smlLayerGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="100%" style="stop-color:#4F46E5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="smlProcessorGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#06B6D4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="smlFlowGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="smlUnderlineGrad" x1="240" y1="910" x2="840" y2="910" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
</linearGradient>
|
||||
<filter id="smlProcessorGlow" x="-30%" y="-30%" width="160%" height="160%">
|
||||
<feGaussianBlur stdDeviation="8" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter id="smlNodeGlow" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="4" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<style>
|
||||
.sml-wordmark { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; font-weight: 700; }
|
||||
</style>
|
||||
</defs>
|
||||
|
||||
<!-- Light background -->
|
||||
<rect width="1080" height="1080" fill="#F8FAFC"/>
|
||||
|
||||
<!-- Centered Logo Icon with padding -->
|
||||
<g transform="translate(190, 180)">
|
||||
<!-- Layers -->
|
||||
<rect x="0" y="30" width="700" height="70" rx="14" fill="url(#smlLayerGrad)" opacity="0.7"/>
|
||||
<rect x="0" y="265" width="700" height="70" rx="14" fill="url(#smlLayerGrad)"/>
|
||||
<rect x="0" y="500" width="700" height="70" rx="14" fill="url(#smlLayerGrad)" opacity="0.7"/>
|
||||
|
||||
<!-- Flows -->
|
||||
<path d="M100 100 Q100 180 220 240 Q320 290 320 300" stroke="url(#smlFlowGrad)" stroke-width="8" fill="none" opacity="0.6" stroke-linecap="round"/>
|
||||
<path d="M600 100 Q600 180 480 240 Q380 290 380 300" stroke="url(#smlFlowGrad)" stroke-width="8" fill="none" opacity="0.6" stroke-linecap="round"/>
|
||||
<path d="M320 300 Q320 310 220 360 Q100 420 100 500" stroke="url(#smlFlowGrad)" stroke-width="8" fill="none" opacity="0.6" stroke-linecap="round"/>
|
||||
<path d="M380 300 Q380 310 480 360 Q600 420 600 500" stroke="url(#smlFlowGrad)" stroke-width="8" fill="none" opacity="0.6" stroke-linecap="round"/>
|
||||
|
||||
<!-- I/O Points -->
|
||||
<circle cx="100" cy="65" r="18" fill="#22D3EE" filter="url(#smlNodeGlow)"/>
|
||||
<circle cx="600" cy="65" r="18" fill="#22D3EE" filter="url(#smlNodeGlow)"/>
|
||||
<circle cx="100" cy="535" r="18" fill="#6366F1" filter="url(#smlNodeGlow)"/>
|
||||
<circle cx="600" cy="535" r="18" fill="#6366F1" filter="url(#smlNodeGlow)"/>
|
||||
|
||||
<!-- Central processor -->
|
||||
<rect x="260" y="210" width="180" height="180" rx="32" fill="url(#smlProcessorGrad)" filter="url(#smlProcessorGlow)"/>
|
||||
<rect x="296" y="246" width="108" height="108" rx="18" fill="#ffffff"/>
|
||||
|
||||
<!-- Equalizer bars -->
|
||||
<rect x="316" y="280" width="14" height="40" rx="4" fill="#22D3EE"/>
|
||||
<rect x="343" y="268" width="14" height="64" rx="4" fill="#06B6D4"/>
|
||||
<rect x="370" y="274" width="14" height="52" rx="4" fill="#22D3EE"/>
|
||||
|
||||
<!-- Indicator -->
|
||||
<circle cx="326" cy="265" r="7" fill="#22D3EE"/>
|
||||
</g>
|
||||
|
||||
<!-- Wordmark -->
|
||||
<text x="540" y="880" class="sml-wordmark" font-size="90" fill="url(#smlLayerGrad)" text-anchor="middle">Stratum<tspan fill="url(#smlProcessorGrad)">I</tspan>Ops</text>
|
||||
|
||||
<!-- Subtitle
|
||||
<text x="540" y="960" font-family="Inter, sans-serif" font-size="28" fill="#6366F1" text-anchor="middle" opacity="0.7" font-weight="500">Intelligent Infrastructure Operations</text>
|
||||
-->
|
||||
|
||||
<!-- Underline -->
|
||||
<line x1="240" y1="910" x2="840" y2="910" stroke="url(#smlUnderlineGrad)" stroke-width="6" stroke-linecap="round" opacity="0.7"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.2 KiB |
77
assets/logos/stratumiops-v-static.svg
Normal file
@ -0,0 +1,77 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400" width="400" height="400">
|
||||
<defs>
|
||||
<linearGradient id="vpsLayerGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="100%" style="stop-color:#4F46E5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="vpsProcessorGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#06B6D4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="vpsFlowGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="vpsUnderlineGrad" x1="45" y1="305" x2="355" y2="305" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
</linearGradient>
|
||||
<filter id="vpsProcessorGlow" x="-30%" y="-30%" width="160%" height="160%">
|
||||
<feGaussianBlur stdDeviation="6" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter id="vpsNodeGlow" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="3" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<style>
|
||||
.vps-wordmark { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; font-weight: 700; }
|
||||
</style>
|
||||
</defs>
|
||||
|
||||
<!-- Logo Icon (centered) -->
|
||||
<g transform="translate(90, 40)">
|
||||
<!-- Layers -->
|
||||
<rect x="0" y="18" width="220" height="24" rx="5" fill="url(#vpsLayerGrad)" opacity="0.7"/>
|
||||
<rect x="0" y="88" width="220" height="24" rx="5" fill="url(#vpsLayerGrad)"/>
|
||||
<rect x="0" y="158" width="220" height="24" rx="5" fill="url(#vpsLayerGrad)" opacity="0.7"/>
|
||||
|
||||
<!-- Flows -->
|
||||
<path d="M35 42 Q35 65 70 85 Q95 100 95 100" stroke="url(#vpsFlowGrad)" stroke-width="3" fill="none" opacity="0.6" stroke-linecap="round"/>
|
||||
<path d="M185 42 Q185 65 150 85 Q125 100 125 100" stroke="url(#vpsFlowGrad)" stroke-width="3" fill="none" opacity="0.6" stroke-linecap="round"/>
|
||||
<path d="M95 100 Q95 100 70 115 Q35 135 35 158" stroke="url(#vpsFlowGrad)" stroke-width="3" fill="none" opacity="0.6" stroke-linecap="round"/>
|
||||
<path d="M125 100 Q125 100 150 115 Q185 135 185 158" stroke="url(#vpsFlowGrad)" stroke-width="3" fill="none" opacity="0.6" stroke-linecap="round"/>
|
||||
|
||||
<!-- I/O Points -->
|
||||
<circle cx="35" cy="30" r="6" fill="#22D3EE" filter="url(#vpsNodeGlow)"/>
|
||||
<circle cx="185" cy="30" r="6" fill="#22D3EE" filter="url(#vpsNodeGlow)"/>
|
||||
<circle cx="35" cy="170" r="6" fill="#6366F1" filter="url(#vpsNodeGlow)"/>
|
||||
<circle cx="185" cy="170" r="6" fill="#6366F1" filter="url(#vpsNodeGlow)"/>
|
||||
|
||||
<!-- Central processor -->
|
||||
<rect x="85" y="75" width="50" height="50" rx="9" fill="url(#vpsProcessorGrad)" filter="url(#vpsProcessorGlow)"/>
|
||||
<rect x="97" y="87" width="26" height="26" rx="5" fill="#ffffff" opacity="0.95"/>
|
||||
|
||||
<!-- Static equalizer bars -->
|
||||
<rect x="101" y="96" width="4" height="13" rx="1" fill="#22D3EE"/>
|
||||
<rect x="108" y="93" width="4" height="18" rx="1" fill="#06B6D4"/>
|
||||
<rect x="115" y="95" width="4" height="14" rx="1" fill="#22D3EE"/>
|
||||
</g>
|
||||
|
||||
<!-- Wordmark (centered below icon) -->
|
||||
<text x="200" y="285" class="vps-wordmark" font-size="48" fill="url(#vpsLayerGrad)" text-anchor="middle">
|
||||
Stratum<tspan fill="url(#vpsProcessorGrad)">I</tspan>Ops
|
||||
</text>
|
||||
|
||||
<!-- Underline -->
|
||||
<line x1="45" y1="305" x2="355" y2="305" stroke="url(#vpsUnderlineGrad)" stroke-width="3" stroke-linecap="round" opacity="0.7"/>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
180
assets/logos/stratumiops-v.svg
Normal file
@ -0,0 +1,180 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400" width="400" height="400">
|
||||
<defs>
|
||||
<linearGradient id="vpLayerGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="100%" style="stop-color:#4F46E5"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="vpProcessorGrad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#06B6D4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="vpFlowGrad" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
<animate attributeName="x1" values="0%;100%;0%" dur="2.5s" repeatCount="indefinite"/>
|
||||
<animate attributeName="x2" values="100%;200%;100%" dur="2.5s" repeatCount="indefinite"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="vpUnderlineGrad" x1="45" y1="305" x2="355" y2="305" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="vpShimmer" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||
<stop offset="0%" style="stop-color:#6366F1"/>
|
||||
<stop offset="40%" style="stop-color:#6366F1"/>
|
||||
<stop offset="50%" style="stop-color:#22D3EE"/>
|
||||
<stop offset="60%" style="stop-color:#6366F1"/>
|
||||
<stop offset="100%" style="stop-color:#6366F1"/>
|
||||
<animate attributeName="x1" values="-100%;100%" dur="3s" repeatCount="indefinite" begin="2s"/>
|
||||
<animate attributeName="x2" values="0%;200%" dur="3s" repeatCount="indefinite" begin="2s"/>
|
||||
</linearGradient>
|
||||
<filter id="vpProcessorGlow" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="5" result="coloredBlur">
|
||||
<animate attributeName="stdDeviation" values="4;8;4" dur="1.5s" repeatCount="indefinite"/>
|
||||
</feGaussianBlur>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
<filter id="vpNodeGlow" x="-50%" y="-50%" width="200%" height="200%">
|
||||
<feGaussianBlur stdDeviation="3" result="coloredBlur"/>
|
||||
<feMerge>
|
||||
<feMergeNode in="coloredBlur"/>
|
||||
<feMergeNode in="SourceGraphic"/>
|
||||
</feMerge>
|
||||
</filter>
|
||||
|
||||
<path id="vpPathIn1" d="M25 40 Q25 65 55 80 Q85 95 95 100" fill="none"/>
|
||||
<path id="vpPathIn2" d="M215 40 Q215 65 185 80 Q155 95 145 100" fill="none"/>
|
||||
<path id="vpPathOut1" d="M95 100 Q85 105 55 120 Q25 135 25 160" fill="none"/>
|
||||
<path id="vpPathOut2" d="M145 100 Q155 105 185 120 Q215 135 215 160" fill="none"/>
|
||||
|
||||
<style>
|
||||
.vp-wordmark { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; font-weight: 700; }
|
||||
</style>
|
||||
</defs>
|
||||
|
||||
<!-- Logo Icon (centered) -->
|
||||
<g transform="translate(90, 40)">
|
||||
<!-- Layers -->
|
||||
<rect x="0" y="18" width="220" height="24" rx="5" fill="url(#vpLayerGrad)" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0.7" dur="0.4s" fill="freeze"/>
|
||||
<animate attributeName="opacity" values="0.5;0.8;0.5" dur="3s" repeatCount="indefinite" begin="1s"/>
|
||||
</rect>
|
||||
<rect x="0" y="88" width="220" height="24" rx="5" fill="url(#vpLayerGrad)" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.4s" fill="freeze" begin="0.15s"/>
|
||||
</rect>
|
||||
<rect x="0" y="158" width="220" height="24" rx="5" fill="url(#vpLayerGrad)" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0.7" dur="0.4s" fill="freeze" begin="0.3s"/>
|
||||
<animate attributeName="opacity" values="0.8;0.5;0.8" dur="3s" repeatCount="indefinite" begin="1s"/>
|
||||
</rect>
|
||||
|
||||
<!-- Flows -->
|
||||
<path d="M35 42 Q35 65 70 85 Q95 100 95 100" stroke="url(#vpFlowGrad)" stroke-width="3" fill="none" opacity="0" stroke-linecap="round">
|
||||
<animate attributeName="opacity" values="0;0.6" dur="0.3s" fill="freeze" begin="0.5s"/>
|
||||
</path>
|
||||
<path d="M185 42 Q185 65 150 85 Q125 100 125 100" stroke="url(#vpFlowGrad)" stroke-width="3" fill="none" opacity="0" stroke-linecap="round">
|
||||
<animate attributeName="opacity" values="0;0.6" dur="0.3s" fill="freeze" begin="0.6s"/>
|
||||
</path>
|
||||
<path d="M95 100 Q95 100 70 115 Q35 135 35 158" stroke="url(#vpFlowGrad)" stroke-width="3" fill="none" opacity="0" stroke-linecap="round">
|
||||
<animate attributeName="opacity" values="0;0.6" dur="0.3s" fill="freeze" begin="0.7s"/>
|
||||
</path>
|
||||
<path d="M125 100 Q125 100 150 115 Q185 135 185 158" stroke="url(#vpFlowGrad)" stroke-width="3" fill="none" opacity="0" stroke-linecap="round">
|
||||
<animate attributeName="opacity" values="0;0.6" dur="0.3s" fill="freeze" begin="0.8s"/>
|
||||
</path>
|
||||
|
||||
<!-- Particles -->
|
||||
<circle r="4" fill="#22D3EE" filter="url(#vpNodeGlow)">
|
||||
<animateMotion dur="1.2s" repeatCount="indefinite" begin="1.5s">
|
||||
<mpath href="#vpPathIn1"/>
|
||||
</animateMotion>
|
||||
<animate attributeName="opacity" values="1;0.5;0.2" dur="1.2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
</circle>
|
||||
<circle r="4" fill="#22D3EE" filter="url(#vpNodeGlow)">
|
||||
<animateMotion dur="1.2s" repeatCount="indefinite" begin="1.8s">
|
||||
<mpath href="#vpPathIn2"/>
|
||||
</animateMotion>
|
||||
<animate attributeName="opacity" values="1;0.5;0.2" dur="1.2s" repeatCount="indefinite" begin="1.8s"/>
|
||||
</circle>
|
||||
<circle r="3" fill="#6366F1">
|
||||
<animateMotion dur="1.2s" repeatCount="indefinite" begin="2s">
|
||||
<mpath href="#vpPathOut1"/>
|
||||
</animateMotion>
|
||||
<animate attributeName="opacity" values="0.2;0.5;1" dur="1.2s" repeatCount="indefinite" begin="2s"/>
|
||||
</circle>
|
||||
<circle r="3" fill="#6366F1">
|
||||
<animateMotion dur="1.2s" repeatCount="indefinite" begin="2.3s">
|
||||
<mpath href="#vpPathOut2"/>
|
||||
</animateMotion>
|
||||
<animate attributeName="opacity" values="0.2;0.5;1" dur="1.2s" repeatCount="indefinite" begin="2.3s"/>
|
||||
</circle>
|
||||
|
||||
<!-- I/O Points -->
|
||||
<circle cx="35" cy="30" r="0" fill="#22D3EE" filter="url(#vpNodeGlow)">
|
||||
<animate attributeName="r" values="0;6" dur="0.25s" fill="freeze" begin="0.2s"/>
|
||||
<animate attributeName="r" values="5;8;5" dur="2s" repeatCount="indefinite" begin="1.2s"/>
|
||||
</circle>
|
||||
<circle cx="185" cy="30" r="0" fill="#22D3EE" filter="url(#vpNodeGlow)">
|
||||
<animate attributeName="r" values="0;6" dur="0.25s" fill="freeze" begin="0.25s"/>
|
||||
<animate attributeName="r" values="6;5;6" dur="2s" repeatCount="indefinite" begin="1.2s"/>
|
||||
</circle>
|
||||
<circle cx="35" cy="170" r="0" fill="#6366F1" filter="url(#vpNodeGlow)">
|
||||
<animate attributeName="r" values="0;6" dur="0.25s" fill="freeze" begin="0.35s"/>
|
||||
<animate attributeName="r" values="5;8;5" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
</circle>
|
||||
<circle cx="185" cy="170" r="0" fill="#6366F1" filter="url(#vpNodeGlow)">
|
||||
<animate attributeName="r" values="0;6" dur="0.25s" fill="freeze" begin="0.4s"/>
|
||||
<animate attributeName="r" values="6;5;6" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
</circle>
|
||||
|
||||
<!-- Central processor -->
|
||||
<rect x="85" y="75" width="50" height="50" rx="9" fill="url(#vpProcessorGrad)" filter="url(#vpProcessorGlow)" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.4s" fill="freeze" begin="0.45s"/>
|
||||
</rect>
|
||||
<rect x="97" y="87" width="26" height="26" rx="5" fill="#ffffff" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0.95" dur="0.3s" fill="freeze" begin="0.6s"/>
|
||||
</rect>
|
||||
|
||||
<!-- Equalizer bars -->
|
||||
<rect x="101" y="93" width="4" height="11" rx="1" fill="#22D3EE" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.2s" fill="freeze" begin="0.8s"/>
|
||||
<animate attributeName="height" values="11;18;8;14;11" dur="0.6s" repeatCount="indefinite" begin="1.2s"/>
|
||||
<animate attributeName="y" values="93;90;96;93;93" dur="0.6s" repeatCount="indefinite" begin="1.2s"/>
|
||||
</rect>
|
||||
<rect x="108" y="91" width="4" height="15" rx="1" fill="#06B6D4" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.2s" fill="freeze" begin="0.85s"/>
|
||||
<animate attributeName="height" values="15;9;13;18;15" dur="0.55s" repeatCount="indefinite" begin="1.25s"/>
|
||||
<animate attributeName="y" values="91;95;93;90;91" dur="0.55s" repeatCount="indefinite" begin="1.25s"/>
|
||||
</rect>
|
||||
<rect x="115" y="94" width="4" height="9" rx="1" fill="#22D3EE" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.2s" fill="freeze" begin="0.9s"/>
|
||||
<animate attributeName="height" values="9;16;8;12;9" dur="0.5s" repeatCount="indefinite" begin="1.3s"/>
|
||||
<animate attributeName="y" values="94;91;96;94;94" dur="0.5s" repeatCount="indefinite" begin="1.3s"/>
|
||||
</rect>
|
||||
|
||||
<!-- Processor pulse -->
|
||||
<rect x="85" y="75" width="50" height="50" rx="9" fill="none" stroke="#22D3EE" stroke-width="2" opacity="0">
|
||||
<animate attributeName="x" values="85;75" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="y" values="75;65" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="width" values="50;70" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="height" values="50;70" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="rx" values="9;12" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
<animate attributeName="opacity" values="0.5;0" dur="2s" repeatCount="indefinite" begin="1.5s"/>
|
||||
</rect>
|
||||
</g>
|
||||
|
||||
<!-- Wordmark (centered below icon) -->
|
||||
<text x="200" y="285" class="vp-wordmark" font-size="48" fill="url(#vpShimmer)" text-anchor="middle" opacity="0">
|
||||
<animate attributeName="opacity" values="0;1" dur="0.5s" fill="freeze" begin="0.9s"/>
|
||||
Stratum<tspan fill="url(#vpProcessorGrad)">I</tspan>Ops
|
||||
</text>
|
||||
|
||||
<!-- Underline -->
|
||||
<line x1="45" y1="305" x2="45" y2="305" stroke="url(#vpUnderlineGrad)" stroke-width="3" stroke-linecap="round" opacity="0">
|
||||
<animate attributeName="opacity" values="0;0.7" dur="0.1s" fill="freeze" begin="1.4s"/>
|
||||
<animate attributeName="x2" values="45;355" dur="0.8s" fill="freeze" begin="1.4s" calcMode="spline" keySplines="0.25 0.1 0.25 1"/>
|
||||
</line>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 10 KiB |