Skip to main content

Plan: Set Up UIS Branding

IMPLEMENTATION RULES: Before implementing this plan, read and follow:

Status: Complete

Goal: Establish complete branding assets for the UIS documentation site.

Last Updated: 2026-01-19

Priority: High (blocks other documentation work)


Overview

Set up the brand folder structure and create/collect all branding assets needed for the UIS Docusaurus site, following the pattern established by DevContainer Toolbox.


Phase 1: Brand Folder Structure

Tasks

  • 1.1 Create website/static/img/brand/ folder
  • 1.2 Copy and adapt main logo (uis-logo-green.svg) with SovereignSky colors
  • 1.3 Update docusaurus.config.ts to use new logo
  • 1.4 Create logo variant for dark mode (uis-logo-teal.svg)
  • 1.5 Create text logo similar to DCT's cube-dct-green.svg:
    • Create uis-text-green.svg with pyramid logo + "UIS" text
    • Use SovereignSky green (#3a8f5e)
    • Similar layout: logo on left, text on right
  • 1.6 Adapt publish scripts from DCT:
    • publish-logo.sh - Copies SVG logo to Docusaurus location (static/img/logo.svg)
    • publish-favicon.sh - Creates multi-size favicon.ico from SVG (16x16, 32x32, 48x48)
    • Change default source to uis-logo-green.svg
  • 1.7 Copy other branding assets from ~/Downloads/uis-branding/ to brand folder

Validation

User confirms brand folder structure is correct.


Phase 2: Animated Hero SVG

Overview

Create an animated SVG for the homepage hero section, similar to DCT's FloatingCubes component. The animation shows services being added to the UIS cloud, communicating that the platform can run many services.

Design Description

  • Background: Cloud shape from uis-logo-green.svg
  • Inside cloud: Pyramid of cubes (service icons) with same look/feel as DCT hero
  • Below cloud: Row of cubes representing available services waiting to be deployed
  • Animation: Cubes float up from the row below and settle into positions inside the cloud
  • Message: Visually demonstrates "complete datacenter on your laptop" concept

Tasks

  • 2.1 Create FloatingCubes React component (adapt from DCT)
    • Located in website/src/components/FloatingCubes/
    • index.tsx - Main component with SVG and animations
    • styles.module.css - Component styles
  • 2.2 Create animated hero SVG (uis-hero-animation.svg):
    • Cloud outline as container/background
    • 5 cubes inside cloud (pyramid arrangement)
    • 5 cubes floating outside cloud (service queue)
    • CSS animations for cube movement
  • 2.3 Implement cube animation logic:
    • AI cube animates from outside into top slot
    • Floating cubes bob up and down
    • Subtle idle animation on stacked cubes
    • Staggered timing for natural feel
  • 2.4 Integrate hero into homepage (src/pages/index.tsx)
  • 2.5 Test animations across browsers (Chrome, Firefox, Safari)
  • 2.6 Ensure responsive behavior on mobile

Reference Files

  • DCT component: devcontainer-toolbox/website/src/components/FloatingCubes/index.tsx
  • UIS logo: website/static/img/brand/uis-logo-green.svg
  • Concept files: ~/Downloads/uis-branding/uis-animated-hero-v2.svg, uis-swap-animation.svg

Validation

User confirms hero animation displays correctly and conveys the intended message.


Phase 3: Category Logos

Decision: Harmonize with DevContainer Toolbox

Category logos use Heroicons (MIT License) with SovereignSky green (#3a8f5e). This matches the approach used in DCT for consistency across SovereignSky projects.

Reused from DCT (5 icons):

UIS LogoDCT SourceHeroicon
ai-logo.svgai-tools-logo.svgSparkles
monitoring-logo.svgbackground-services-logo.svgServerStack
datascience-logo.svgdata-analytics-logo.svgChartBar
core-logo.svginfra-config-logo.svgCog
development-logo.svglanguage-dev-logo.svgCode

Created new for UIS (5 icons):

UIS LogoHeroicon
authentication-logo.svgShieldCheck
databases-logo.svgCircleStack
queues-logo.svgQueueList
search-logo.svgMagnifyingGlass
management-logo.svgAdjustmentsHorizontal

Tasks

  • 3.1 Create website/static/img/categories/ folder
  • 3.2 Create website/static/img/categories/src/ for SVG sources
  • 3.3 Create/collect category logos (10 total, SVG preferred):
    • ai-logo.svg - AI & Machine Learning (from DCT)
    • authentication-logo.svg - Authentication & SSO (new)
    • databases-logo.svg - Databases (new)
    • monitoring-logo.svg - Observability & Monitoring (from DCT)
    • queues-logo.svg - Message Queues & Caching (new)
    • search-logo.svg - Search & Indexing (new)
    • datascience-logo.svg - Data Science & Analytics (from DCT)
    • core-logo.svg - Core Infrastructure (from DCT)
    • management-logo.svg - Management Tools (new)
    • development-logo.svg - Development Tools (from DCT)
  • 3.4 Create LOGO-SOURCES.md documenting icon sources
  • 3.5 Verify categories.json logo paths match created files

Validation

User confirms category logos match SovereignSky branding.


Phase 4: Service Logos

Complete Service List

Services identified from provision-host/kubernetes/ scripts and manifests:

Core Infrastructure (01-core):

ServiceLogo FileSource
traefiktraefik-logo.svgtraefik.io
nginxnginx-logo.svgnginx.org

Databases (02-databases):

ServiceLogo FileSource
postgresqlpostgresql-logo.svgpostgresql.org/media
mysqlmysql-logo.svgmysql.com
mongodbmongodb-logo.svgmongodb.com
qdrantqdrant-logo.svgqdrant.tech

Message Queues (03-queues):

ServiceLogo FileSource
redisredis-logo.svgredis.io
rabbitmqrabbitmq-logo.svgrabbitmq.com

Search (04-search):

ServiceLogo FileSource
elasticsearchelasticsearch-logo.svgelastic.co/brand

API Management (05-apim):

ServiceLogo FileSource
graviteegravitee-logo.svggravitee.io

Management Tools (06-management):

ServiceLogo FileSource
pgadminpgadmin-logo.svgpgadmin.org
redisinsightredisinsight-logo.svgredis.io/insight

AI & ML (07-ai):

ServiceLogo FileSource
openwebuiopenwebui-logo.svgopenwebui.com
ollamaollama-logo.svgollama.ai
litellmlitellm-logo.svglitellm.ai
tikatika-logo.svgtika.apache.org

Development Tools (08-development):

ServiceLogo FileSource
argocdargocd-logo.svgCNCF Artwork

Network (09-network):

ServiceLogo FileSource
tailscaletailscale-logo.svgtailscale.com
cloudflarecloudflare-logo.svgcloudflare.com

Data Science (10-datascience):

ServiceLogo FileSource
sparkspark-logo.svgApache Foundation
jupyterhubjupyterhub-logo.svgjupyter.org
unity-catalogunity-catalog-logo.svgunitycatalog.io

Monitoring (11-monitoring):

ServiceLogo FileSource
prometheusprometheus-logo.svgCNCF Artwork
tempotempo-logo.svgCNCF Artwork
lokiloki-logo.svgCNCF Artwork
otel-collectorotel-collector-logo.svgCNCF Artwork
grafanagrafana-logo.svggrafana.com/brand

Authentication (12-auth):

ServiceLogo FileSource
authentikauthentik-logo.svggoauthentik.io

Total: 28 services

Tasks

  • 4.1 Create website/static/img/services/ folder
  • 4.2 Create website/static/img/services/src/ for original sources
  • 4.3 Collect service logos (SVG preferred, PNG fallback):
    • Core Infrastructure (2):
      • traefik-logo.svg
      • nginx-logo.svg
    • Databases (4):
      • postgresql-logo.svg
      • mysql-logo.svg
      • mongodb-logo.svg
      • qdrant-logo.svg
    • Message Queues (2):
      • redis-logo.svg
      • rabbitmq-logo.svg
    • Search (1):
      • elasticsearch-logo.svg
    • API Management (1):
      • gravitee-logo.svg
    • Management Tools (2):
      • pgadmin-logo.png
      • redisinsight-logo.svg
    • AI & ML (4):
      • openwebui-logo.png
      • ollama-logo.svg
      • litellm-logo.svg
      • tika-logo.svg
    • Development Tools (1):
      • argocd-logo.svg
    • Network (2):
      • tailscale-logo.svg
      • cloudflare-logo.svg
    • Data Science (3):
      • spark-logo.svg
      • jupyterhub-logo.svg
      • unity-catalog-logo.png
    • Monitoring (5):
      • prometheus-logo.svg
      • tempo-logo.svg
      • loki-logo.png
      • otel-collector-logo.svg
      • grafana-logo.svg
    • Authentication (1):
      • authentik-logo.svg
  • 4.4 Update services.json with correct logo paths
  • 4.5 Update LOGO-SOURCES.md with service logo sources

Logo Source Priority

  1. CNCF Artwork - Prometheus, Loki, Tempo, Argo CD, OpenTelemetry (Apache 2.0)
  2. Official brand pages - Grafana, PostgreSQL, Redis, Elastic, etc.
  3. Simple Icons - Fallback for common tech logos (simpleicons.org)
  4. Devicon - Programming/dev tool icons (devicon.dev)

Validation

User confirms service logos are available for all 28 services.


Phase 5: Stacks Setup

Overview

Create visual representation and documentation for service stacks - groups of services that work together as a unit. Stacks are defined in stacks.json and show installation order and dependencies.

Current Stacks (from stacks.json)

Stack IDNameServices
observabilityObservability Stackprometheus → tempo → loki → otel-collector (opt) → grafana
ai-localLocal AI Stackollama → litellm (opt) → openwebui
datascienceData Science Stackspark → jupyterhub → unity-catalog (opt)

Tasks

  • 5.1 Create stack logos/icons for each stack:
    • observability-stack-logo.svg - Metrics/logs/traces visualization
    • ai-local-stack-logo.svg - Neural network/processor icon
    • datascience-stack-logo.svg - Beaker with data dots
  • 5.2 Create website/static/img/stacks/ folder structure
  • 5.3 Design stack card component for homepage or docs (future):
    • Show stack name and description
    • List component services with logos
    • Indicate installation order (position)
    • Mark optional components
  • 5.4 Create stack documentation page template (future):
    • Overview of what the stack provides
    • Prerequisites and dependencies
    • Installation instructions (which scripts to activate)
    • Configuration options
  • 5.5 Update stacks.json with logo references
  • 5.6 Create React component for displaying stacks (optional/future):
    • website/src/components/StackCard/index.tsx
    • Shows services in order with visual flow

Stack Logo Design

Used Heroicons style (option 3) to match category logos with SovereignSky green (#3a8f5e).

Validation

User confirms stacks are visually represented and documented.


Phase 6: Social Card and Favicon

Tasks

  • 6.1 Create social-card-background.png (similar to DCT's version)
    • Generated with Gemini AI, cleaned with remove-gemini-stars.sh
    • 1344x768 pixels
    • Cloud with cubes visual, space for text on right side
  • 6.2 Adapt create-social-card.sh script from DCT:
    • Title: "Urbalurba\nInfrastructure\nStack"
    • Tagline: "Complete datacenter\non your laptop."
    • Logo: uis-text-green.svg in bottom right
    • Uses ImageMagick to composite background + text + logo
  • 6.3 Adapt publish-social-card.sh script from DCT:
    • Outputs only static/img/social-card.jpg (optimized JPG)
    • Removed PNG output to avoid duplication
  • 6.4 Run scripts to generate social-card-generated.png
  • 6.5 Create favicon from UIS logo (website/static/img/favicon.ico)
  • 6.6 Verify social card and favicon in Docusaurus config
  • 6.7 Create remove-gemini-stars.sh script to clean AI watermarks
    • Supports -left and -right flags for corner selection
    • Validates image size for social cards
  • 6.8 Add README.md documenting brand folder workflow

Validation

User confirms social card appears correctly in link previews.


Phase 7: Component Infrastructure

Overview

Set up the foundation for displaying services, categories, and stacks. Adapt components from DevContainer Toolbox (DCT) project.

Reference: DCT Component Architecture

DCT uses these components at /Users/terje.christensen/learn/projects-2025/devcontainer-toolbox/website/src/components/:

  • ToolCard → adapt to ServiceCard (64px logo + title + 2-line abstract + tags)
  • CategoryCard → reuse (48px logo + title + service count)
  • ToolGrid → adapt to ServiceGrid (responsive 1-4 column grid)
  • CategoryGrid → reuse (responsive grid of categories)
  • RelatedTools → adapt to RelatedServices (horizontal scroll)

Tasks

  • 7.1 Create TypeScript interfaces for UIS data types:
    • src/types/service.ts - Service interface
    • src/types/category.ts - Category interface
    • src/types/stack.ts - Stack interface
    • src/types/index.ts - Central exports
  • 7.2 Create utility functions:
    • src/utils/paths.ts - URL generation for services/categories
    • src/utils/data.ts - Data loading helpers
    • src/utils/index.ts - Central exports
  • 7.3 CSS variables already in place from DCT adaptation in custom.css

Files to Create

website/src/
├── types/
│ ├── service.ts
│ ├── category.ts
│ └── stack.ts
└── utils/
├── paths.ts
└── data.ts

Validation

TypeScript types compile without errors.


Phase 8: Service & Category Components

Overview

Create the card and grid components for displaying services and categories.

Tasks

  • 8.1 Create ServiceCard component:
    • src/components/ServiceCard/index.tsx
    • src/components/ServiceCard/styles.module.css
    • Layout: 64px logo | title + 2-line abstract + tags
    • Hover effect: shadow lift
    • Links to service detail page (using docs field from services.json)
  • 8.2 Create ServiceGrid component:
    • src/components/ServiceGrid/index.tsx
    • src/components/ServiceGrid/styles.module.css
    • Groups services by category with section headers
    • Responsive: 1 col (mobile) → 4 col (desktop)
  • 8.3 Create CategoryCard component:
    • src/components/CategoryCard/index.tsx
    • src/components/CategoryCard/styles.module.css
    • Layout: 48px logo | title + abstract + service count badge
    • Links to category section on services page
  • 8.4 Create CategoryGrid component:
    • src/components/CategoryGrid/index.tsx
    • src/components/CategoryGrid/styles.module.css
    • Auto-counts services per category
    • Sorts by category order
  • 8.5 Create RelatedServices component:
    • src/components/RelatedServices/index.tsx
    • src/components/RelatedServices/styles.module.css
    • Horizontal scroll of mini service cards
    • Ready for use on service detail pages

Files to Create

website/src/components/
├── ServiceCard/
│ ├── index.tsx
│ └── styles.module.css
├── ServiceGrid/
│ ├── index.tsx
│ └── styles.module.css
├── CategoryCard/
│ ├── index.tsx
│ └── styles.module.css
├── CategoryGrid/
│ ├── index.tsx
│ └── styles.module.css
└── RelatedServices/
├── index.tsx
└── styles.module.css

Validation

Components render correctly in isolation (Storybook or test page).


Phase 9: Stack Components

Overview

Create StackCard with service flow diagram showing installation order.

Design

┌─────────────────────────────────────────────────────────┐
│ [Stack Logo] Observability Stack │
│ Complete monitoring with metrics... │
│ │
│ prometheus → tempo → loki → otel-collector* → grafana │
│ ⬤ ⬤ ⬤ ○ ⬤ │
│ │
│ * optional │
└─────────────────────────────────────────────────────────┘

Tasks

  • 9.1 Create StackCard component:
    • src/components/StackCard/index.tsx
    • src/components/StackCard/styles.module.css
    • Header: stack logo + name + description
    • Flow diagram: service logos with arrows between them
    • Optional services shown with dashed border and dimmed
    • Service names shown optionally
  • 9.2 Create StackGrid component:
    • src/components/StackGrid/index.tsx
    • src/components/StackGrid/styles.module.css
    • Responsive grid (1-3 columns)
  • 9.3 Create ServiceFlowDiagram sub-component:
    • src/components/ServiceFlowDiagram/index.tsx
    • src/components/ServiceFlowDiagram/styles.module.css
    • Renders service logos in order with SVG arrows
    • Handles optional services styling (dashed border, dimmed)

Files to Create

website/src/components/
├── StackCard/
│ ├── index.tsx
│ └── styles.module.css
├── StackGrid/
│ ├── index.tsx
│ └── styles.module.css
└── ServiceFlowDiagram/
├── index.tsx
└── styles.module.css

Validation

Stack cards display with correct service flow diagrams.


Phase 10: Services Page

Overview

Create the /services page displaying all services grouped by category, with stacks section.

Page Structure

/services
├── Header: "Infrastructure Services"
├── Stacks Section: "Service Stacks" (StackGrid)
├── Categories Section: "Browse by Category" (CategoryGrid)
└── Per-Category Sections:
├── "AI & Machine Learning" (ServiceGrid category="AI")
├── "Authentication & SSO" (ServiceGrid category="AUTHENTICATION")
├── ... (all 10 categories)

Tasks

  • 10.1 Create services page:
    • src/pages/services.tsx
    • src/pages/services.module.css
  • 10.2 Implement page sections:
    • Header section with title and description
    • Categories section with CategoryGrid
    • Pre-configured Stacks section with StackGrid
    • All Services section with ServiceGrid (grouped by category)
  • 10.3 Add anchor links for categories (e.g., /services#ai)
    • Anchors created dynamically by ServiceGrid component
  • 10.4 Add "View All" functionality if categories have many services (future enhancement)

Files to Create

website/src/pages/
├── services.tsx
└── services.module.css

Validation

Services page displays all services grouped correctly.


Phase 11: Service Detail Pages

Overview

Create individual detail pages for each service, linked from ServiceCard.

URL Structure

Services link to existing docs where available:

  • /docs/services/ai/openwebui (if doc exists)
  • /docs/services/monitoring/prometheus (if doc exists)

Tasks

  • 11.1 Service detail pages:
    • Existing docs in docs/packages/[category]/ already serve as detail pages
    • ServiceCard links directly to docs field from services.json
  • 11.2 Path utility created (src/utils/paths.ts):
    • getCategoryFolder, getServicePath, getCategoryPath functions
    • ServiceCard uses docs field directly from services.json
  • 11.3 RelatedServices component ready:
    • Available via import RelatedServices from '@site/src/components/RelatedServices'
    • Can be added to doc pages as needed
  • 11.4 ServiceCard links work:
    • Links to docs path specified in services.json
    • Verified all referenced docs exist

Path Mapping

CategoryDocs Folder
AI/docs/services/ai/
AUTHENTICATION/docs/services/authentication/
DATABASES/docs/services/databases/
MONITORING/docs/services/monitoring/
QUEUES/docs/services/queues/
SEARCH/docs/services/search/
DATASCIENCE/docs/services/datascience/
CORE/docs/services/core/
MANAGEMENT/docs/services/management/
DEVELOPMENT/docs/services/development/

Validation

Service cards link to correct detail pages or external URLs.


Phase 12: Final Verification

Tasks

  • 12.1 Verify all logo references in JSON files are valid
    • All 28 service logos verified
    • All 10 category logos verified
    • All 3 stack logos verified
  • 12.2 Test site builds without errors
    • Build succeeds with npm run build
    • TypeScript compiles without errors (npx tsc --noEmit)
    • Anchor warnings for dynamic content (work at runtime)
  • 12.3 Visual check of all components on services page (manual)
  • 12.4 Test responsive design (mobile, tablet, desktop) (manual)
  • 12.5 Verify all links work (internal docs, external URLs) (manual)
  • 12.6 Test light/dark mode for all components (manual)
  • 12.7 Check accessibility (alt text, keyboard navigation) (manual)

Validation

User confirms site builds and all pages display correctly.


Acceptance Criteria

Branding (Phases 1-6) ✓

  • Brand folder structure matches DCT pattern
  • Main logo displays correctly in navbar
  • Dark mode logo variant exists
  • Category logos created (10) - Heroicons with SovereignSky green
  • Service logos created (28 services - 24 SVG, 4 PNG)
  • Stack logos/visuals created (3 stacks)
  • Social card image created
  • Favicon updated
  • Data model defined (categories, services, stacks with JSON-LD)
  • JSON schemas created for validation
  • Service dependencies captured (requires[])
  • Service stacks defined (observability, ai-local, datascience)
  • Animated hero displays on homepage with cube animations

Components (Phases 7-9) ✓

  • TypeScript interfaces created for all data types
  • ServiceCard component displays service with logo, title, abstract, tags
  • CategoryCard component displays category with service count
  • StackCard component displays service flow diagram
  • Grid components support responsive layouts
  • Components support light/dark mode (using CSS variables)

Pages (Phases 10-11) ✓

  • /services page displays all services grouped by category
  • Stacks section shows service flow diagrams
  • Category navigation works with anchor links
  • Service cards link to detail pages (docs field from services.json)
  • RelatedServices component available for doc pages

Final (Phase 12) - In Progress

  • Site builds without errors
  • All links work correctly (manual verification needed)
  • Responsive design verified on mobile/tablet/desktop (manual)
  • Accessibility requirements met (manual)

Files to Create/Modify

Brand Assets (Created):

  • website/static/img/brand/uis-logo-teal.svg
  • website/static/img/brand/uis-text-green.svg
  • website/static/img/brand/social-card-background.png
  • website/static/img/brand/social-card-generated.png
  • website/static/img/brand/create-social-card.sh
  • website/static/img/brand/publish-social-card.sh
  • website/static/img/brand/publish-logo.sh
  • website/static/img/brand/publish-favicon.sh
  • website/static/img/brand/remove-gemini-stars.sh
  • website/static/img/brand/README.md
  • website/static/img/social-card.jpg
  • website/static/img/favicon.ico
  • website/static/img/logo.svg
  • website/src/components/FloatingCubes/index.tsx
  • website/src/components/FloatingCubes/styles.module.css

Data Files (Created):

  • website/src/data/schemas/category.schema.json
  • website/src/data/schemas/service.schema.json
  • website/src/data/schemas/stack.schema.json
  • website/src/data/stacks.json

Data Files (Modified):

  • website/src/data/categories.json - converted to JSON-LD
  • website/src/data/services.json - converted to JSON-LD, added requires[]

Category Logos (Created):

  • website/static/img/categories/ai-logo.svg
  • website/static/img/categories/authentication-logo.svg
  • website/static/img/categories/core-logo.svg
  • website/static/img/categories/databases-logo.svg
  • website/static/img/categories/datascience-logo.svg
  • website/static/img/categories/development-logo.svg
  • website/static/img/categories/management-logo.svg
  • website/static/img/categories/monitoring-logo.svg
  • website/static/img/categories/queues-logo.svg
  • website/static/img/categories/search-logo.svg
  • website/static/img/LOGO-SOURCES.md

Service Logos (Created):

  • website/static/img/services/*.svg (24 SVG files)
  • website/static/img/services/*.png (4 PNG files)

Stack Assets (Created):

  • website/static/img/stacks/observability-stack-logo.svg
  • website/static/img/stacks/ai-local-stack-logo.svg
  • website/static/img/stacks/datascience-stack-logo.svg

TypeScript Types (Phase 7):

  • website/src/types/service.ts
  • website/src/types/category.ts
  • website/src/types/stack.ts
  • website/src/types/index.ts

Utility Functions (Phase 7):

  • website/src/utils/paths.ts
  • website/src/utils/data.ts
  • website/src/utils/index.ts

Service & Category Components (Phase 8):

  • website/src/components/ServiceCard/index.tsx
  • website/src/components/ServiceCard/styles.module.css
  • website/src/components/ServiceGrid/index.tsx
  • website/src/components/ServiceGrid/styles.module.css
  • website/src/components/CategoryCard/index.tsx
  • website/src/components/CategoryCard/styles.module.css
  • website/src/components/CategoryGrid/index.tsx
  • website/src/components/CategoryGrid/styles.module.css
  • website/src/components/RelatedServices/index.tsx
  • website/src/components/RelatedServices/styles.module.css

Stack Components (Phase 9):

  • website/src/components/StackCard/index.tsx
  • website/src/components/StackCard/styles.module.css
  • website/src/components/StackGrid/index.tsx
  • website/src/components/StackGrid/styles.module.css
  • website/src/components/ServiceFlowDiagram/index.tsx
  • website/src/components/ServiceFlowDiagram/styles.module.css

Pages (Phase 10):

  • website/src/pages/services.tsx
  • website/src/pages/services.module.css

Component Exports:

  • website/src/components/index.ts

Other Modified:

  • website/src/pages/index.tsx - integrate hero animation

Notes

  • Use SovereignSky brand colors: green #3a8f5e, teal #25c2a0, navy #1e3a5f
  • SVG sources kept in src/ subfolders for future editing
  • Many service logos may be available from official project sites (check licensing)

Logo Format Decision

Standard for both UIS and DCT projects:

  1. Prefer SVG - Use SVG when available (scalable, dark mode adaptable, small files)
  2. WebP as fallback - Convert to WebP when only raster images exist
  3. Naming convention: {id}-logo.svg or {id}-logo.webp
  4. JSON reference includes extension explicitly
  5. Folder structure:
    static/img/services/
    ├── src/ # Original source files
    ├── postgresql-logo.svg # SVG preferred
    └── obscure-tool-logo.webp # WebP fallback

This decision will be ported back to DCT later.

UIS Provisioning System (Reference)

The UIS automation system is simple and tested:

provision-host/kubernetes/
├── provision-kubernetes.sh # Main script - loops folders and runs scripts
├── 01-core/
│ ├── 020-setup-nginx.sh # Active - will run on first boot
│ └── not-in-use/ # Inactive scripts
├── 02-databases/
│ └── not-in-use/ # All inactive
├── 11-monitoring/
│ ├── 01-setup-prometheus.sh # Active - runs in order
│ ├── 02-setup-tempo.sh
│ ├── 03-setup-loki.sh
│ ├── 04-setup-otel-collector.sh
│ ├── 05-setup-grafana.sh
│ ├── 06-setup-testdata.sh
│ └── not-in-use/
└── ...

Key points:

  • provision-kubernetes.sh loops through numbered folders and runs scripts in order
  • Scripts in not-in-use/ are inactive (not installed)
  • Moving a script from not-in-use/ to parent folder activates it
  • Scripts run on first boot (initial provisioning)
  • Script numbering within folders controls installation order
  • Ansible playbooks (ansible/playbooks/) provide the actual deployment logic

Folder numbering corresponds to manifest ranges:

FolderCategoryManifest Range
01-coreCore Infrastructure000-029
02-databasesDatabases040-059
03-queuesMessage Queues060-069
11-monitoringObservability030-039
12-authAuthentication070-079
07-aiAI & ML200-229

Data Model (Completed)

File structure:

website/src/data/
├── schemas/
│ ├── category.schema.json # JSON Schema for categories
│ ├── service.schema.json # JSON Schema for services
│ └── stack.schema.json # JSON Schema for stacks
├── categories.json # 10 service categories
├── services.json # 28 services
└── stacks.json # 3 service stacks

categories.json

JSON-LD format using schema.org CategoryCodeSet and CategoryCode.

{
"@context": "https://schema.org",
"@type": "CategoryCodeSet",
"name": "UIS Service Categories",
"description": "Service categories for the Urbalurba Infrastructure Stack",
"hasCategoryCode": [
{
"@type": "CategoryCode",
"codeValue": "AI",
"name": "AI & Machine Learning",
"order": 1,
"tags": ["ai", "llm", "openwebui", "ollama"],
"abstract": "AI and machine learning services for local LLM inference.",
"summary": "Local AI infrastructure with OpenWebUI, Ollama, and LiteLLM.",
"logo": "ai-logo.svg",
"manifest_range": "200-229"
}
// ... 9 more categories
]
}

Categories (10 total):

codeValuenamemanifest_range
AIAI & Machine Learning200-229
AUTHENTICATIONAuthentication & SSO070-079
DATABASESDatabases040-059
MONITORINGObservability & Monitoring030-039
QUEUESMessage Queues & Caching060-069
SEARCHSearch & Indexing080-089
DATASCIENCEData Science & Analytics240-259
CORECore Infrastructure000-029
MANAGEMENTManagement Tools600-699
DEVELOPMENTDevelopment Tools700-799

services.json

JSON-LD format using schema.org ItemList and SoftwareApplication.

{
"@context": "https://schema.org",
"@type": "ItemList",
"name": "UIS Services",
"description": "Infrastructure services available in the Urbalurba Infrastructure Stack",
"itemListElement": [
{
"@type": "SoftwareApplication",
"identifier": "prometheus",
"name": "Prometheus",
"description": "Time-series metrics collection and alerting",
"applicationCategory": "MONITORING",
"tags": ["monitoring", "metrics", "alerting"],
"abstract": "Pull-based metrics collection with powerful query language.",
"logo": "prometheus-logo.svg",
"url": "https://prometheus.io",
"summary": "Prometheus scrapes metrics from services and stores time-series data.",
"manifest": "031-prometheus.yaml",
"docs": "/docs/services/monitoring/prometheus",
"related": ["grafana", "alertmanager"],
"requires": []
}
// ... 22 more services
]
}

Service fields:

FieldTypeDescription
identifierstringUnique ID (lowercase, hyphenated)
namestringDisplay name
descriptionstringBrief description (1-2 sentences)
applicationCategorystringReference to category codeValue
tagsstring[]Keywords for search
abstractstringOne-line summary
logostringLogo filename (SVG or WebP)
urlstringOfficial project website
summarystringDetailed description
manifeststringKubernetes manifest filename
docsstringPath to docs within site
relatedstring[]Related service IDs (informational)
requiresstring[]Hard dependencies (must be installed first)

Services with dependencies:

Servicerequires
authentikpostgresql, redis
openwebuiollama
grafanaprometheus, loki, tempo
pgadminpostgresql
redisinsightredis
jupyterhubauthentik

stacks.json

JSON-LD format for service bundles that work together.

{
"@context": "https://schema.org",
"@type": "ItemList",
"name": "UIS Stacks",
"description": "Service stacks - groups of services that work together",
"itemListElement": [
{
"@type": "SoftwareSourceCode",
"identifier": "observability",
"name": "Observability Stack",
"description": "Complete monitoring with metrics, logs, and traces",
"category": "MONITORING",
"summary": "Full visibility into your infrastructure...",
"components": [
{ "service": "prometheus", "position": 1, "note": "Metrics collection" },
{ "service": "tempo", "position": 2, "note": "Distributed tracing" },
{ "service": "loki", "position": 3, "note": "Log aggregation" },
{ "service": "otel-collector", "position": 4, "optional": true },
{ "service": "grafana", "position": 5, "note": "Visualization" }
]
}
]
}

Stacks (3 total):

identifiernamecomponents
observabilityObservability Stackprometheus → tempo → loki → otel-collector (opt) → grafana
ai-localLocal AI Stackollama → litellm (opt) → openwebui
datascienceData Science Stackspark → jupyterhub → unity-catalog (opt)

Stack component fields:

FieldTypeDescription
servicestringService identifier from services.json
positionnumberInstallation order (1 = first)
optionalbooleanIf true, stack works without this component
notestringRole description within the stack

Relationship Types

  1. requires (hard dependency)

    • Service won't function without these
    • Example: Authentik requires PostgreSQL and Redis
  2. related (informational)

    • Services that work well together
    • Not a dependency, just helpful context
  3. stack components (installation bundle)

    • Services installed together as a unit
    • Has installation order (position)
    • Some components may be optional

Current approach: JSON files are manually maintained.

Future automation: See PLAN-002-json-generator.md (backlog) for generating JSON from script metadata, following the DCT pattern.