What I wish I knew about AI…

… 10 days ago

Lewis Denham-Parry | Edera.dev

December 4th, 2025 | Cloud-Native Manchester

$ whoami

  • Lewis Denham-Parry
  • Find me on the internet thanks to my name
  • Edera.dev
  • Based in Cardiff
  • Often questions what it is that I’m doing
December 4th, 2025 | Cloud-Native Manchester

Time

December 4th, 2025 | Cloud-Native Manchester

Background

  • Coming back from KCD Edinburgh and starting to prepare for KubeCon NA 2025
  • Create a demo for going to conferences, events, and meetups in the New Year
  • Wanting to look into what AI (pronounced: Aye Eye) is

Assumptions

  • AI is creating/taking jobs
  • AI is saving/burning the World
  • AI knows everything/nothing

One constant

  • AI hallucinates
December 4th, 2025 | Cloud-Native Manchester

Read a book

  • “The AI Hallucination” by Lewis Denham-Parry
    • Not a book, but what my AI IDE prompt thinks I read?!?
December 4th, 2025 | Cloud-Native Manchester

Read an actual book

Supremacy Book Cover
December 4th, 2025 | Cloud-Native Manchester

Idea

  • Create an application to create your very own Axolotl
  • Write an application using only AI
  • Make sure that all components are self hosted and Open Source
  • I don’t want to store any personal identifiable information
  • The generated Axolotl image needs to be appropriate
December 4th, 2025 | Cloud-Native Manchester

Now for the AI generated part

December 4th, 2025 | Cloud-Native Manchester

IvySketch: Design Patterns & AI Workflow

Building GenAI Applications with Kubernetes and AI-Assisted Development

Lewis Denham-Parry | Edera.dev

December 4th, 2025 | Cloud-Native Manchester

About This Talk

  • Project Architecture & Design Patterns
  • Kubernetes Deployment Strategies
  • AI-Powered Development Workflow
  • Real-World Examples from Production
December 4th, 2025 | Cloud-Native Manchester

Part 1: Introduction

December 4th, 2025 | Cloud-Native Manchester

What is IvySketch?

IvyBot - AI-powered Axolotl character designer

  • Chat with AI to design custom axolotl characters
  • AI generates detailed prompts for image creation
  • ComfyUI produces unique axolotl images
  • Educational content about Edera (English Ivy)

Live Demo: https://ivysketch.me

IvySketch QR Code
Supremacy Book Cover
December 4th, 2025 | Cloud-Native Manchester

Technology Stack

Backend:

  • Go + OpenTelemetry + Prometheus
  • Chi router with middleware chain
  • NATS JetStream for async processing

Frontend:

  • React + Vite + TypeScript
  • Tailwind CSS styling
  • Server-Sent Events (SSE) for streaming
December 4th, 2025 | Cloud-Native Manchester

Technology Stack (continued)

AI Services:

  • LLM: Ollama (Qwen2.5:7B)
  • Image Gen: ComfyUI (Flux.1-schnell)
  • Message Queue: NATS JetStream

Observability:

  • Prometheus (metrics)
  • Grafana (dashboards)
  • Jaeger (distributed tracing)
December 4th, 2025 | Cloud-Native Manchester

Deployment

Infrastructure:

  • Local Dev: Docker Compose
  • Production: Kubernetes (EKS)
  • CI/CD: GitHub Actions
  • Secrets: Sealed Secrets

Result: Production-ready GenAI application with comprehensive observability

December 4th, 2025 | Cloud-Native Manchester

Part 2: Architecture & Design Patterns

December 4th, 2025 | Cloud-Native Manchester

Architecture Overview

┌─────────────┐     ┌──────────────┐     ┌─────────┐
│  Frontend   │────▶│   Backend    │────▶│ Ollama  │
│ React+Vite  │     │  Go Service  │     │   LLM   │
└─────────────┘     └──────┬───────┘     └─────────┘
                           │
                           ▼
                  ┌───────────────┐     ┌──────────┐
                  │  NATS Queue   │────▶│ ComfyUI  │
                  │  JetStream    │     │ ImageGen │
                  └───────────────┘     └──────────┘
                           │
                           ▼
                  ┌────────────────────────────┐
                  │   Observability Stack      │
                  │ Prometheus│Grafana│Jaeger  │
                  └────────────────────────────┘
December 4th, 2025 | Cloud-Native Manchester

Backend Middleware Chain

// src/main.go - Middleware composition
router := chi.NewRouter()

// Cross-cutting concerns as composable middleware
router.Use(middleware.Metrics)      // Prometheus metrics
router.Use(middleware.Tracing)      // OpenTelemetry spans
router.Use(middleware.CORS)         // Cross-origin requests
router.Use(middleware.RateLimit)    // Rate limiting
router.Use(middleware.Auth)         // API key auth (optional)

// Business logic handlers
router.Post("/chat", handleChat)
router.Post("/image/generate", handleImageGenerate)
December 4th, 2025 | Cloud-Native Manchester

Middleware Benefits

Clean Separation of Concerns:

  • Each middleware has single responsibility
  • Easy to test in isolation
  • Composable and reusable

Observability Built-in:

  • Every request automatically traced
  • Metrics collected for all endpoints
  • Structured logging with context

Security Layers:

  • CORS protection
  • Rate limiting
  • Optional API key authentication
December 4th, 2025 | Cloud-Native Manchester

Frontend Architecture

React Component Structure:

<App>
  <Header>
    <ModelInfoCard />
  </Header>
  <ChatBox>
    <MessageList>
      <MessageItem />
    </MessageList>
    <ImageGenerationPanel />
    <MessageInput />
  </ChatBox>
</App>
December 4th, 2025 | Cloud-Native Manchester

Frontend: Streaming Chat

Server-Sent Events (SSE):

const eventSource = new EventSource("/chat");

eventSource.onmessage = (event) => {
  const token = event.data;
  setMessages((prev) => updateLastMessage(prev, token));
};

eventSource.onerror = () => {
  eventSource.close();
};

Benefits:

  • Real-time token streaming from LLM
  • Progressive message rendering
  • Better user experience than polling
December 4th, 2025 | Cloud-Native Manchester

LLM Integration Pattern

Ollama with OpenAI-Compatible API:

client := openai.NewClient(config.BaseURL)

resp, err := client.CreateChatCompletionStream(ctx, openai.ChatCompletionRequest{
    Model: config.Model,
    Messages: messages,
    Stream: true,
})

// Stream tokens to client
for chunk := range resp {
    token := chunk.Choices[0].Delta.Content
    fmt.Fprintf(w, "data: %s\n\n", token)
    flusher.Flush()
}
December 4th, 2025 | Cloud-Native Manchester

Async Message Queue Pattern

NATS JetStream for Image Generation:

// Backend publishes to queue
func (p *Publisher) PublishImageRequest(
    ctx context.Context,
    prompt string,
) error {
    msg := ImageRequest{
        SessionID: sessionID,
        Prompt:    prompt,
        Timestamp: time.Now(),
    }
    return p.js.Publish("ivysketch.images.generate", msg)
}

Benefits:

  • Decouples frontend from slow image generation
  • Enables horizontal scaling of workers
  • Fault tolerance with message persistence
December 4th, 2025 | Cloud-Native Manchester

Image Worker Service

Consumer Pattern:

// Image worker consumes from queue
sub, _ := js.Subscribe("ivysketch.images.generate", func(msg *nats.Msg) {
    var req ImageRequest
    json.Unmarshal(msg.Data, &req)

    // Generate image with ComfyUI
    imageURL, err := comfyui.Generate(req.Prompt)

    // Publish result
    js.Publish("ivysketch.images.results", ImageResult{
        SessionID: req.SessionID,
        ImageURL:  imageURL,
    })

    msg.Ack()
})
December 4th, 2025 | Cloud-Native Manchester

Distributed Tracing with OpenTelemetry

Semantic Conventions for GenAI:

span.SetAttributes(
    attribute.String("gen_ai.system", "ollama"),
    attribute.String("gen_ai.request.model", "qwen2.5:7b"),
    attribute.String("gen_ai.operation.name", "chat"),
    attribute.Int64("gen_ai.usage.output_tokens", tokenCount),
)

Follows OpenTelemetry v1.24.0+ conventions

See: https://opentelemetry.io/docs/specs/semconv/

December 4th, 2025 | Cloud-Native Manchester

Distributed Tracing: Trace Propagation

NATS Message Trace Context:

// Inject trace context into NATS message
otel.GetTextMapPropagator().Inject(ctx, nats.HeaderCarrier(msg.Header))

// Extract trace context in consumer
ctx := otel.GetTextMapPropagator().Extract(
    context.Background(),
    nats.HeaderCarrier(msg.Header),
)

Result: End-to-end tracing across services and message queue

December 4th, 2025 | Cloud-Native Manchester

Prometheus Metrics

Custom Metrics for AI Workloads:

// Time to first token (TTFT)
ivysketch_first_token_latency_seconds

// Token generation rate
ivysketch_chat_tokens_total{type="output"}

// Queue depth monitoring
ivysketch_nats_queue_depth{stream="prompts"}

// ComfyUI generation time
ivysketch_image_generation_duration_seconds
December 4th, 2025 | Cloud-Native Manchester

Part 3: Kubernetes Deployment Patterns

December 4th, 2025 | Cloud-Native Manchester

Kubernetes Structure: Base + Overlays

k8s/
├── base/                    # Shared resources
│   ├── namespace.yaml
│   ├── backend-deployment.yaml
│   ├── frontend-deployment.yaml
│   ├── ollama-deployment.yaml
│   ├── nats-statefulset.yaml
│   └── services.yaml
├── overlays/
│   ├── development/         # Local (kind) config
│   │   └── kustomization.yaml
│   └── production/          # EKS config
│       ├── kustomization.yaml
│       ├── ingress.yaml
│       └── sealedsecret-ivysketch.yaml
└── observability/           # Monitoring stack
    ├── prometheus/
    └── grafana/
December 4th, 2025 | Cloud-Native Manchester

Kustomize: Base Resources

base/kustomization.yaml:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: ivysketch

resources:
  - namespace.yaml
  - backend-deployment.yaml
  - frontend-deployment.yaml
  - ollama-deployment.yaml
  - nats-statefulset.yaml
  - services.yaml
  - networkpolicies.yaml
December 4th, 2025 | Cloud-Native Manchester

Kustomize: Production Overlay

overlays/production/kustomization.yaml:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - ../../base

patchesStrategicMerge:
  - deployment-backend.yaml      # Replicas: 3, resources
  - deployment-ollama.yaml        # GPU nodes
  - deployment-image-worker.yaml  # GPU nodes

resources:
  - ingress.yaml
  - sealedsecret-ivysketch.yaml
December 4th, 2025 | Cloud-Native Manchester

GPU Node Scheduling

Ollama Deployment - GPU Requirements:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ivysketch-ollama
spec:
  template:
    spec:
      nodeSelector:
        node.kubernetes.io/instance-type: g5.2xlarge
      tolerations:
        - key: nvidia.com/gpu
          operator: Exists
          effect: NoSchedule
      containers:
        - name: ollama
          resources:
            limits:
              nvidia.com/gpu: "1"
December 4th, 2025 | Cloud-Native Manchester

Sealed Secrets for Production

Problem: How to store secrets in Git securely?

Solution: Sealed Secrets Controller

# Encrypt secret with cluster public key
kubectl create secret generic ivysketch-secrets \
  --from-literal=API_KEY=secret123 \
  --from-literal=NATS_PASSWORD=secure456 \
  --dry-run=client -o yaml | \
kubeseal -o yaml > sealedsecret-ivysketch.yaml

# Commit encrypted secret to Git
git add k8s/overlays/production/sealedsecret-ivysketch.yaml
git commit -m "feat(k8s): update production secrets"

Only the cluster can decrypt!

December 4th, 2025 | Cloud-Native Manchester

NetworkPolicies for Security

Principle: Default Deny, Explicit Allow

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: backend-netpol
spec:
  podSelector:
    matchLabels:
      app: ivysketch-backend
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: ivysketch-frontend
  egress:
    - to:
        - podSelector:
            matchLabels:
              app: ivysketch-ollama
December 4th, 2025 | Cloud-Native Manchester

Ingress and TLS

cert-manager for Let’s Encrypt:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ivysketch
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
    - hosts:
        - ivysketch.me
      secretName: ivysketch-tls
  rules:
    - host: ivysketch.me
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: ivysketch-frontend
                port:
                  number: 80
December 4th, 2025 | Cloud-Native Manchester

Persistent Storage

Ollama Model Storage:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ollama-models
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: gp3
  resources:
    requests:
      storage: 20Gi

Mounted to: /root/.ollama/models

Benefits: Models persist across pod restarts, faster startup

December 4th, 2025 | Cloud-Native Manchester

Observability Stack Deployment

Prometheus (Helm):

helm install prometheus prometheus-community/kube-prometheus-stack \
  --namespace observability \
  --set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false

ServiceMonitor for Backend:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: ivysketch-backend
spec:
  selector:
    matchLabels:
      app: ivysketch-backend
  endpoints:
    - port: metrics
      interval: 15s
December 4th, 2025 | Cloud-Native Manchester

Part 4: AI-Powered Development Workflow

December 4th, 2025 | Cloud-Native Manchester

Documentation-Driven Development

Core Philosophy: All work flows through documentation

GitHub Issue
    ↓
Plan Document (docs/plan/issues/NNN_*.md)
    ↓
Research Template (analyze codebase)
    ↓
Implementation (AI-guided)
    ↓
Tests (unit, integration, E2E)
    ↓
PR Review (AI + human)
    ↓
Production Deployment

Result: 326+ completed tasks across 13 phases

December 4th, 2025 | Cloud-Native Manchester

Task Planning Structure

docs/prompt_plan.md:

## Task Phase 1

- [x] Write tests for current Docker Compose functionality
- [x] Set up testing framework and CI pipeline
- [x] Create production frontend Dockerfile with nginx

## Task Phase 2

- [x] Create backend config package with env loader
- [x] Write unit tests for config package
- [x] Update backend to use centralized config

## Task Phase 3

- [x] Write tests for API key authentication
- [x] Implement API key middleware

Sequential execution prevents scope creep

December 4th, 2025 | Cloud-Native Manchester

AI Workflow: Plan Phase

Command: /workflow-issue-plan <issue-number>

What it does:

  1. Fetches issue details from GitHub
  2. Researches relevant codebase files
  3. Creates comprehensive implementation plan

Output: docs/plan/issues/477_create_talk_*.md

# GitHub Issue #477: Create talk

## Problem Statement

[Clear description of the issue]

## Solution Design

[Approach, rationale, trade-offs]

## Implementation Plan

[Step-by-step actionable tasks]
December 4th, 2025 | Cloud-Native Manchester

AI Workflow: Research Phase

Command: /workflow-research-plan <file>

What it does:

  1. Reads research template with key questions
  2. Analyzes codebase (Glob, Grep, Read)
  3. Studies existing patterns and implementations
  4. Creates detailed plan with code examples

Research Techniques:

  • Find relevant files by pattern
  • Search for code patterns
  • Review related documentation
  • Cross-reference with completed tasks
December 4th, 2025 | Cloud-Native Manchester

AI Workflow: Action Phase

Command: /workflow-action-plan <file>

What it does:

  1. Reads implementation plan
  2. Creates comprehensive todo list
  3. Implements all tasks incrementally
  4. Runs tests and build verification
  5. Updates plan status to “Complete”
  6. Runs pre-commit hooks
  7. Creates conventional commit

Ensures: No steps skipped, all tests pass, hooks validated

December 4th, 2025 | Cloud-Native Manchester

AI Workflow: Review Phase

Command: /workflow-code-review

Comprehensive Review:

  • Code quality and style compliance
  • Error handling and logging patterns
  • Test coverage analysis
  • Security vulnerability detection
  • Performance considerations
  • Documentation completeness
  • Pre-commit hook compliance

Result: High-quality PR ready for human review

December 4th, 2025 | Cloud-Native Manchester

Custom Slash Commands

Project-Specific Commands (.claude/commands/):

  • /view-site - View production site with Playwright MCP
  • /nats-check-messages - Check NATS JetStream queue status
  • /github-issue-create - Create GitHub issue with prompts
  • /github-action-create-issue - Analyze failed CI, create issue

Global Commands (~/.claude/commands/):

  • /workflow-pr-feedback-plan - Create plan from PR feedback
  • /workflow-pr-feedback-action - Fetch, plan, and implement PR feedback
  • /git-pre-commit - Run pre-commit hooks
December 4th, 2025 | Cloud-Native Manchester

Plan Document Structure

Comprehensive Template:

# GitHub Issue #NNN: Title

## Problem Statement

- Current behavior
- Expected behavior
- Impact

## Current State Analysis

- Relevant code/config
- Related context

## Solution Design

- Approach
- Implementation details
- Benefits

## Implementation Plan

- Step-by-step tasks
- Code examples
- Testing strategy

## Success Criteria

- [ ] Checkboxes for validation
December 4th, 2025 | Cloud-Native Manchester

Real Example: Issue #310

Problem: Backend nil pointer dereference in image generation handler

Plan Phase Output:

  • Root cause: Missing nil check for NATS publisher
  • Impact: Production crashes when NATS disabled
  • Solution: Add nil check + tests

Implementation: 3 files modified, 2 tests added

Result: Fixed in PR #311, deployed to production

Time Saved: ~2 hours of investigation + planning

December 4th, 2025 | Cloud-Native Manchester

Part 5: Real-World Examples

December 4th, 2025 | Cloud-Native Manchester

Example 1: NATS Integration Journey

Timeline: Issues #115 → #117 → #120 → #131

  1. #115: Add NATS infrastructure to K8s

    • Plan: Research NATS deployment patterns
    • Action: Add NATS StatefulSet + auth config
  2. #117: Integrate NATS for prompt handling

    • Plan: Design publisher/consumer pattern
    • Action: Implement backend NATS client
December 4th, 2025 | Cloud-Native Manchester

Example 1: NATS Integration (continued)

  1. #120: Fix: Chat endpoint not using NATS

    • Review: AI found disconnected implementation
    • Action: Wire up NATS publishing
  2. #131: Fix: Production auth failures

    • Debug: Authorization violation errors
    • Action: Fix credential propagation

Result: Fully functional async message queue

December 4th, 2025 | Cloud-Native Manchester

Example 1: Code Snippet

NATS Publisher:

// src/pkg/nats/publisher.go
func (p *Publisher) PublishCharacterPrompt(
    ctx context.Context,
    sessionID, prompt string,
) error {
    msg := CharacterPromptMessage{
        SessionID: sessionID,
        Prompt:    prompt,
        Timestamp: time.Now(),
    }

    data, err := json.Marshal(msg)
    if err != nil {
        return fmt.Errorf("marshal: %w", err)
    }

    // Publish with trace context propagation
    return p.js.Publish("ivysketch.prompts.character.create", data)
}
December 4th, 2025 | Cloud-Native Manchester

Example 2: ComfyUI Image Generation

Timeline: Issues #137 → #138 → #146 → #176

  1. #137: Integrate ComfyUI for AI image generation

    • Plan: Research ComfyUI API and workflow format
    • Action: Implement ComfyUI client package
  2. #138: Add ComfyUI to Docker Compose

    • Plan: Configure ComfyUI with Flux.1 model
    • Action: Create Dockerfile, add to compose.yaml
December 4th, 2025 | Cloud-Native Manchester

Example 2: ComfyUI (continued)

  1. #146: Fix: ComfyUI pod pending on K8s

    • Problem: Storage class issues, GPU node needed
    • Action: Add GPU node group, fix PVC
  2. #176: Disable ComfyUI CI/CD builds

    • Problem: 16.3 GB image, CI disk space exhaustion
    • Solution: Local builds only, skip in GitHub Actions

Lesson: Large AI model images require infrastructure planning

December 4th, 2025 | Cloud-Native Manchester

Example 3: Image Worker Service

Timeline: Issues #229 → #233 → #254

  1. #229: Implement image worker for async generation

    • Plan: Design worker consuming NATS, calling ComfyUI
    • Action: Create worker service with S3 upload
  2. #233: Implement integration tests for image worker

    • Plan: Test NATS consumer, ComfyUI client, S3 upload
    • Action: Comprehensive test suite with mocks
December 4th, 2025 | Cloud-Native Manchester

Example 3: Image Worker (continued)

  1. #254: Fix: Image worker pods crash-looping in K8s
    • Problem: Missing network policies, incorrect NATS credentials
    • Action: Add egress rules, fix secret propagation

Result: Production-ready async image generation pipeline

Architecture:

Chat → NATS Queue → Image Worker → ComfyUI → S3 → Frontend
December 4th, 2025 | Cloud-Native Manchester

Part 6: Lessons Learned

December 4th, 2025 | Cloud-Native Manchester

What Worked Well

✅ Documentation-Driven Development

  • Clear plans reduced confusion
  • Easy to onboard contributors
  • Historical context preserved

✅ AI-Assisted Planning

  • Faster research phase
  • Comprehensive implementation plans
  • Consistent documentation quality

✅ Sequential Task Execution

  • Prevented scope creep
  • Dependencies tracked naturally
  • Clear progress visibility
December 4th, 2025 | Cloud-Native Manchester

What Worked Well (continued)

✅ Pre-commit Hooks

  • Caught issues before CI/CD
  • Consistent code quality
  • Prevented secrets from being committed

✅ Comprehensive Testing

  • Unit, integration, E2E tests
  • Testcontainers for integration tests
  • High confidence in deployments

✅ Observability from Day 1

  • Distributed tracing revealed issues quickly
  • Custom metrics for AI workloads
  • Grafana dashboards for production monitoring
December 4th, 2025 | Cloud-Native Manchester

Challenge 1: GPU Node Security

Issue #161: Backend → Ollama communication blocked

Problem:

  • GPU nodes use different security group than worker nodes
  • K8s NetworkPolicies correct, AWS security groups blocked traffic

Solution:

# Add ingress rule to cluster security group
aws ec2 authorize-security-group-ingress \
  --group-id sg-cluster \
  --source-group sg-node \
  --protocol all

Lesson: Multi-layer complexity (K8s + AWS)

December 4th, 2025 | Cloud-Native Manchester

Challenge 2: Large Model Images

Issues #176, #206: CI/CD disk space exhaustion

Problem:

  • Ollama image: 4.7 GB (with Qwen2.5:7B model)
  • ComfyUI image: 16.3 GB (with Flux.1 models)
  • GitHub Actions runners: limited disk space

Solution:

  • Disabled CI/CD builds for Ollama and ComfyUI
  • Local builds only
  • Production deployments pull from local registry

Lesson: AI model sizes impact CI/CD architecture

December 4th, 2025 | Cloud-Native Manchester

Challenge 3: Cold Start Latency

Issue #113: 30s first request latency

Problem:

  • Ollama loads model on first request
  • User waits ~30 seconds for first response

Solution:

  • Preload model in Ollama Dockerfile
  • Model baked into Docker image
  • First request now <500ms

Lesson: Pre-warming AI services improves UX

December 4th, 2025 | Cloud-Native Manchester

AI Development Best Practices

  1. Plan Before Code

    • Use /workflow-issue-plan to create plan
    • Review plan with human before starting
  2. Research Thoroughly

    • Use /workflow-research-plan for complex tasks
    • Understand existing patterns first
  3. Test Continuously

    • Write tests alongside implementation
    • Run tests frequently during development
December 4th, 2025 | Cloud-Native Manchester

AI Development Best Practices (continued)

  1. Review Objectively

    • Use /workflow-code-review for PR preparation
    • Verify AI suggestions manually
  2. Document Decisions

    • Capture rationale in plan documents
    • Update docs as implementation evolves
  3. Avoid Over-Engineering

    • Keep solutions simple and focused
    • Don’t add features beyond requirements
December 4th, 2025 | Cloud-Native Manchester

Avoiding AI Pitfalls

❌ Over-Engineering

  • AI tends to add unnecessary abstractions
  • Keep it simple, solve the actual problem

❌ Trusting AI Without Verification

  • Always review code changes
  • Run tests, verify behavior

❌ Skipping Manual Testing

  • Automated tests don’t catch everything
  • Test in production-like environment

❌ Example Contamination

  • AI may use patterns from training data
  • Ensure solutions fit your architecture
December 4th, 2025 | Cloud-Native Manchester

Part 7: Conclusion & Q&A

December 4th, 2025 | Cloud-Native Manchester

Key Takeaways

  1. Architecture: Microservices + observability = production-ready GenAI apps
  2. Kubernetes: Base + overlays pattern scales from dev to production
  3. AI Workflow: Documentation-driven development with AI agents accelerates
    delivery
  4. Real-World: 326+ tasks completed, production-deployed on EKS

IvySketch proves AI-assisted development works at scale

December 4th, 2025 | Cloud-Native Manchester

Resources

Project Links:

Documentation:

  • Architecture Guide: docs/architecture-guide.md
  • Kubernetes Guide: k8s/README.md
  • AI Workflow: .claude/commands/

Contact:

  • Lewis Denham-Parry
  • GitHub: @denhamparry
December 4th, 2025 | Cloud-Native Manchester

Questions?

Thank you!

🎨 IvySketch - AI-powered Axolotl designer 🤖 Built with AI-assisted development
☸️ Deployed on Kubernetes

Try it: https://ivysketch.me

December 4th, 2025 | Cloud-Native Manchester

Back to the Human part

Lessons learned from my perspective

December 4th, 2025 | Cloud-Native Manchester

Its not just weekly requirement changes

We now have to deal with technology change to a weekly cadence

  • It feels there isn’t much long term scope of where AI is going
  • Look at the security of MCPs for instance
  • Manage technology change as well as requirement change

Who would have thought another option I’d have today is nano banana pro?!?

December 4th, 2025 | Cloud-Native Manchester

Hallucinations aren’t an AI problem…

…they’re a you problem

  • Hallucinations are a Human problem
  • Interns !== AI
  • AI === a new employee
  • AI helps you get started today *

* maybe

December 4th, 2025 | Cloud-Native Manchester

We’re in an AI bubble…

…and we survived the dotcom bubble (Citation needed)

  • I don’t trust SaaS long term
  • Short term, it helps us
  • Look towards Open Source AI agents like Goose
  • Look to host your own LLMs
  • Give people the tools to use AI, otherwise…
December 4th, 2025 | Cloud-Native Manchester

Who the f&%k are you!?!

People using AI as if it was their own work

  • People are happy to use AI
  • People aren’t happy to share that they use AI
  • If you copypasta a prompt result, read it first
  • Look towards SLSA, AI is another identity IMO
  • Attest your identity
December 4th, 2025 | Cloud-Native Manchester

Time

AI accentuates our traits

  • I thought AI would help me be better at what I’m not great at
  • It made me better and worse
  • It’s given me time, and has taken it away
December 4th, 2025 | Cloud-Native Manchester

F&%K LUCK

December 4th, 2025 | Cloud-Native Manchester

Questions?

Thank you!

🎨 IvySketch - AI-powered Axolotl designer 🤖 Built with AI-assisted development
☸️ Deployed on Kubernetes

Try it: https://ivysketch.me

🔜 github.com/edera-dev/am-i-isolated

December 4th, 2025 | Cloud-Native Manchester

Speaker Notes: - Create an application to create your very own Axolotl - Nothing scares a business more than trademark infringement - Write an application using only AI - I cannot write any code, but I can write a prompt for an AI to generate the code - Make sure that all components are self hosted and Open Source - I don't want to make any external calls to other hosted services - Caveat for authentication as for the next step... - I don't want to store any personal identifiable information - Email is the only data that is captured, so that we can send an email to the user with their image - The generated Axolotl image needs to be appropriate - Nothing scares a business more than trademark infringement

Speaker Notes: Chi Router with Middleware Chain: - Chi is a lightweight, composable HTTP router for Go (like Express.js for Node) - Middleware chain pattern allows us to compose cross-cutting concerns - Each middleware wraps the request/response cycle: * Metrics middleware - captures Prometheus metrics for every request * Tracing middleware - adds OpenTelemetry spans for distributed tracing * CORS middleware - handles cross-origin requests from frontend * RateLimit middleware - prevents abuse and ensures fair usage * Auth middleware - optional API key authentication - Benefits: Clean code separation, testable in isolation, easy to add/remove - Example coming up in slide 14 shows the actual middleware chain code - This pattern is common in production Go services and scales well