2026-05-27T15:10:18Z by Showboat 0.6.1
This document demonstrates the local Kubernetes development workflow for IdeaBot using MINC (MicroShift in Container) and Tilt. The entire environment runs inside a Docker-in-Docker devcontainer — no cloud cluster required.
The devcontainer comes with all tools pre-installed: Docker (via Docker-in-Docker), Helm, Tilt, MINC, and kubectl. Let's verify:
which docker helm tilt minc kubectl/usr/bin/docker
/usr/local/bin/helm
/home/vscode/.local/bin/tilt
/usr/local/bin/minc
/usr/local/bin/kubectl
The devcontainer's postStartCommand runs sudo mount --make-rshared / automatically — this is required for MINC to set up Kubernetes mount propagation inside Docker-in-Docker.
MINC runs MicroShift (a lightweight OpenShift) inside a Docker container. The --disable-overlay-cache flag is required in Docker-in-Docker because Docker's overlay2 storage is incompatible with CRI-O's expected layout. This flag uses a named volume instead.
minc create --provider docker --disable-overlay-cache 2>&1 || echo '(Cluster already exists — this is expected if re-running the demo)'time=2026-05-27T15:10:37.286Z level=INFO msg="Ensuring cluster image (quay.io/minc-org/minc:4.19.0-okd-scos.17-amd64) ..."
|time=2026-05-27T15:10:37.355Z level=INFO msg="Waiting for MicroShift service to start..."
time=2026-05-27T15:10:37.421Z level=INFO msg="Waiting for KubeConfig ..."
time=2026-05-27T15:10:37.468Z level=INFO msg="Waiting for pods to be ready..."
time=2026-05-27T15:10:38.028Z level=INFO msg="Cluster created"
Verify the cluster is running:
minc list --provider dockermicroshift 127.0.0.1:6443->6443/tcp, 127.0.0.1:9080->80/tcp, 127.0.0.1:9443->443/tcp running
MINC generates a kubeconfig automatically. Let's check that the node is ready and system pods are running:
kubectl get nodesNAME STATUS ROLES AGE VERSION
127.0.0.1.nip.io Ready control-plane,master,worker 19h v1.32.8
kubectl get pods -ANAMESPACE NAME READY STATUS RESTARTS AGE
default ideabot-gateway-7c5ccb54d9-d2lh6 1/1 Running 0 18h
default ideabot-keycloak-7dcd6c764c-c56ls 1/1 Running 0 18h
default ideabot-local-path-provisioner-58d655b8-s6r2g 1/1 Running 0 18h
default ideabot-postgresql-79b7466d54-4lqzv 1/1 Running 0 18h
default ideabot-token-service-57fffbd6bc-7l7gx 1/1 Running 0 18h
default ideabot-web-ui-6565f4c9cc-2qc5m 1/1 Running 0 18h
kube-kindnet kube-kindnet-ds-85fjd 1/1 Running 0 19h
kube-proxy kube-proxy-dcsm8 1/1 Running 0 19h
kube-system csi-snapshot-controller-5ccb457c75-trmlh 1/1 Running 0 19h
openshift-dns dns-default-5hmhm 2/2 Running 0 19h
openshift-dns node-resolver-tnvlc 1/1 Running 0 19h
openshift-ingress router-default-b6d64f795-sqj2z 1/1 Running 0 19h
openshift-operator-lifecycle-manager catalog-operator-79b5c486cd-qdmc9 1/1 Running 0 19h
openshift-operator-lifecycle-manager olm-operator-79c46b86cb-ldhfv 1/1 Running 0 19h
openshift-service-ca service-ca-7cd95d84b-pkjwp 1/1 Running 0 19h
All system pods are running: kube-proxy, kube-kindnet, DNS, ingress router, OLM, and service-ca. The IdeaBot application pods (gateway, web-ui, token-service, keycloak, postgresql) are also running from a previous deploy.
The IdeaBot Helm chart deploys all application components. Tilt handles this automatically, but it can also be done manually:
ls deploy/helm/ideabot/templates/ | head -20common
database
gateway
_helpers.tpl
keycloak
token-service
web-ui
helm dependency build deploy/helm/ideabot 2>&1 | tail -5Saving 1 charts
Downloading local-path-provisioner from repo oci://ghcr.io/rancher/local-path-provisioner/charts
Pulled: ghcr.io/rancher/local-path-provisioner/charts/local-path-provisioner:0.0.36
Digest: sha256:ae31255346657674a47b99619a16fa12bf38e1e6ef51e2df12b0825fdb1fa80c
Deleting outdated charts
helm template ideabot deploy/helm/ideabot --values deploy/helm/ideabot/values-local.yaml | grep 'kind:' | sort | uniq -c | sort -rn 6 kind: Deployment
6 kind: ConfigMap
5 kind: Service
2 - kind: ServiceAccount
2 kind: Secret
1 kind: StorageClass
1 kind: ServiceAccount
1 kind: RoleBinding
1 kind: Role
1 kind: Role
1 kind: Pod
1 kind: PersistentVolumeClaim
1 kind: Job
1 kind: ClusterRoleBinding
1 kind: ClusterRole
1 kind: ClusterRole
The chart creates Deployments for gateway, web-ui, token-service, keycloak, and postgresql, plus a local-path-provisioner for persistent storage.
In Docker-in-Docker, images must be explicitly loaded into CRI-O after building. The pipeline is: docker build → docker save → docker exec -i microshift skopeo copy → CRI-O storage. Let's build one image to demonstrate:
cat build/images.yaml---
images:
- name: ideabot-gateway
context: .
containerfile: packages/gateway/Containerfile
live_update_src: packages/gateway/src
deps:
- packages/gateway/src
- packages/gateway/package.json
- packages/gateway/Containerfile
- packages/core/src
- package-lock.json
- name: ideabot-web-ui
context: .
containerfile: packages/frontend/Containerfile
live_update_src: packages/frontend/src
deps:
- packages/frontend/src
- packages/frontend/package.json
- packages/frontend/webpack.config.ts
- packages/frontend/Containerfile
- packages/core/src
- package-lock.json
- name: ideabot-token-service
context: .
containerfile: packages/token-service/Containerfile
live_update_src: packages/token-service/src
deps:
- packages/token-service/src
- packages/token-service/package.json
- packages/token-service/Containerfile
- packages/core/src
- package-lock.json
docker build --target dev -f packages/gateway/Containerfile -t localhost/ideabot-gateway:local . 2>&1 | tail -5#14 exporting attestation manifest sha256:c6176c4e4247efc267ce1ff9660572887ae519a2e06647f69c16ed6a846d9846 0.0s done
#14 exporting manifest list sha256:bfeb13241d5181c5c225798354be1a0f7f5258282a801b11dbd38d51c9af1de1 done
#14 naming to localhost/ideabot-gateway:local done
#14 unpacking to localhost/ideabot-gateway:local done
#14 DONE 0.1s
Now load it into CRI-O inside the MINC container via skopeo:
docker save localhost/ideabot-gateway:local | docker exec -i microshift skopeo copy docker-archive:/dev/stdin containers-storage:localhost/ideabot-gateway:local 2>&1Getting image source signatures
Copying blob sha256:3975086f238098769f7c270e0532d913ae17cf5f7cc0ad076b549ccb807848c8
Copying blob sha256:bf32c26795be3cb60d1a4300e7e2c57283f5994f5e9058925e8c1db4054f52e2
Copying blob sha256:d06bec56648525c4e177fb5af41ade4557d20a2377b9785dc99efb4f1e8799b2
Copying blob sha256:f495472e6eb0103719df3300368ca80724327ce26a6280815ce51a12b817242e
Copying blob sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
Copying blob sha256:e367f7f869fb7bec2f4b7126c0d460410e76811c9320526af6c34e82fadff68c
Copying blob sha256:b6bda20877e2bd6c9a74925458627bf61ea3909ab8504a1059a155769145e57c
Copying blob sha256:04ba574e42e4b00d659bfbc96136efac19add0631e4c70cc8b7103ce901d8a69
Copying blob sha256:52ab82ee639efdfc74e9def567c12cfdb8925edb8bb02e26c32462369e969b35
Copying blob sha256:1ea52d28b68cfd8711237bbd3e3eab56970a12c4a336b03cc90876cc9c02f278
Copying blob sha256:3a5db6a7b952e58b005cf7a4141d5d8a61af456be592f6949e9175b09fbb164a
Copying config sha256:75b0961227204f64434cadc0a43f496745940d497a2ec9357f25f02fcfe5e7d5
Writing manifest to image destination
docker exec microshift crictl images | grep ideabot-gatewaylocalhost/ideabot-gateway local 75b0961227204 897MB
localhost/ideabot-gateway tilt-build-1779827730 75b0961227204 897MB
localhost/ideabot-gateway tilt-build-1779828083 75b0961227204 897MB
localhost/ideabot-gateway tilt-build-1779822759 f952f9a17b074 897MB
localhost/ideabot-gateway tilt-build-1779823266 f952f9a17b074 897MB
The image is now visible to CRI-O. The tilt-build-* tags are from previous Tilt runs — Tilt uses unique tags for each build cycle.
Tilt automates the entire build-load-deploy cycle. It watches source files, rebuilds images on change, loads them into CRI-O, and restarts pods. The Tiltfile auto-detects whether Podman or Docker is available:
head -52 Tiltfile# IdeaBot Local Development Environment
#
# Prerequisites:
# - MINC cluster running (see below for provider-specific commands)
# - kubectl context set: kubectl config use-context microshift
#
# With Podman (native):
# minc create
# tilt up
# tilt down
# minc delete
#
# With Docker (devcontainer):
# minc create --provider docker --disable-overlay-cache
# tilt up
# tilt down
# minc delete --provider docker
load('ext://uibutton', 'cmd_button', 'location')
allow_k8s_contexts('microshift')
secret_settings(disable_scrub=True)
# ── Container Runtime Detection ──────────────────────────────────
_has_podman = str(local('which podman 2>/dev/null || true', quiet=True)).strip() != ''
# ── Image Builds ─────────────────────────────────────────────────
# Read the shared build matrix — same file consumed by CI (yq) and
# build-local.sh (Node). Tilt uses live_update_src and deps fields
# that other consumers ignore.
images_config = decode_yaml(read_file('build/images.yaml'))
for img in images_config['images']:
deps = img.get('deps', [img['containerfile']])
ref = 'localhost/' + img['name']
src = img.get('live_update_src', '')
if _has_podman:
build_cmd = 'podman build --target dev -f %s -t $EXPECTED_REF %s' % (
img['containerfile'], img['context'],
)
else:
build_cmd = ' && '.join([
'docker build --target dev -f %s -t $EXPECTED_REF %s' % (
img['containerfile'], img['context'],
),
'docker save $EXPECTED_REF | docker exec -i microshift skopeo copy docker-archive:/dev/stdin containers-storage:$EXPECTED_REF',
])
custom_build(
Key points:
- The Tiltfile reads
build/images.yamlfor the image build matrix (shared with CI) - It auto-detects Docker vs Podman and adjusts the build command
- With Docker, each build pipes through
docker save | skopeo copyto load images into CRI-O live_updatesyncs source file changes directly into running containers without a full rebuild
To start the full dev environment, run tilt up. Tilt will build all three images (gateway, web-ui, token-service), load them into CRI-O, deploy the Helm chart, and watch for file changes:
tilt up --stream 2>&1 & TILT_PID=$! ; sleep 90 ; kill $TILT_PID 2>/dev/null ; wait $TILT_PID 2>/dev/null ; echo '--- (tilt up stopped after demo capture) ---'Tilt started on http://localhost:10350/
v0.37.3, built 2026-04-30
Initial Build
Loading Tiltfile at: /workspaces/hermes/Tiltfile
local: which podman 2>/dev/null || true
local: helm dependency build deploy/helm/ideabot
Running: helm template ideabot /workspaces/hermes/deploy/helm/ideabot --include-crds --values deploy/helm/ideabot/values-local.yaml
Successfully loaded Tiltfile (869.219258ms)
ideabot-loca… │
ideabot-loca… │ Initial Build
ideabot-loca… │ STEP 1/1 — Deploying
ideabot-keyc… │
ideabot-keyc… │ Initial Build
ideabot-keyc… │ STEP 1/1 — Deploying
ideabot-gate… │
ideabot-gate… │ Initial Build
ideabot-gate… │ STEP 1/3 — Building Custom Build: [localhost/ideabot-gateway]
ideabot-gate… │ Custom Build: Injecting Environment Variables
ideabot-gate… │ EXPECTED_REF=localhost/ideabot-gateway:tilt-build-1779894717
ideabot-gate… │ EXPECTED_IMAGE=ideabot-gateway
ideabot-gate… │ EXPECTED_TAG=tilt-build-1779894717
ideabot-gate… │ Running cmd: docker build --target dev -f packages/gateway/Containerfile -t $EXPECTED_REF . && docker save $EXPECTED_REF | docker exec -i microshift skopeo copy docker-archive:/dev/stdin containers-storage:$EXPECTED_REF
ideabot-loca… │ Applying YAML to cluster
ideabot-keyc… │ Applying YAML to cluster
ideabot-keyc… │ Objects applied to cluster:
ideabot-keyc… │ → ideabot-keycloak-realm:configmap
ideabot-keyc… │ → ideabot-keycloak:service
ideabot-keyc… │ → ideabot-keycloak:deployment
ideabot-keyc… │
ideabot-keyc… │ Step 1 - 0.02s (Deploying)
ideabot-keyc… │ DONE IN: 0.02s
ideabot-keyc… │
ideabot-toke… │
ideabot-toke… │ Initial Build
ideabot-toke… │ STEP 1/3 — Building Custom Build: [localhost/ideabot-token-service]
ideabot-toke… │ Custom Build: Injecting Environment Variables
ideabot-toke… │ EXPECTED_REF=localhost/ideabot-token-service:tilt-build-1779894717
ideabot-toke… │ EXPECTED_IMAGE=ideabot-token-service
ideabot-toke… │ EXPECTED_TAG=tilt-build-1779894717
ideabot-toke… │ Running cmd: docker build --target dev -f packages/token-service/Containerfile -t $EXPECTED_REF . && docker save $EXPECTED_REF | docker exec -i microshift skopeo copy docker-archive:/dev/stdin containers-storage:$EXPECTED_REF
ideabot-loca… │ Objects applied to cluster:
ideabot-loca… │ → local-path:storageclass
ideabot-loca… │ → ideabot-local-path-provisioner:serviceaccount
ideabot-loca… │ → ideabot-local-path-provisioner:role
ideabot-loca… │ → ideabot-local-path-provisioner:clusterrole
ideabot-loca… │ → ideabot-local-path-provisioner:rolebinding
ideabot-loca… │ → ideabot-local-path-provisioner:clusterrolebinding
ideabot-loca… │ → local-path-config:configmap
ideabot-loca… │ → ideabot-local-path-provisioner:deployment
ideabot-loca… │
ideabot-loca… │ Step 1 - 0.04s (Deploying)
ideabot-loca… │ DONE IN: 0.04s
ideabot-loca… │
ideabot-web-… │
ideabot-web-… │ Initial Build
ideabot-keyc… │
ideabot-keyc… │ Attaching to existing pod (ideabot-keycloak-7dcd6c764c-c56ls). Only new logs will be streamed.
ideabot-web-… │ STEP 1/3 — Building Custom Build: [localhost/ideabot-web-ui]
ideabot-web-… │ Custom Build: Injecting Environment Variables
ideabot-web-… │ EXPECTED_REF=localhost/ideabot-web-ui:tilt-build-1779894717
ideabot-web-… │ EXPECTED_IMAGE=ideabot-web-ui
ideabot-web-… │ EXPECTED_TAG=tilt-build-1779894717
ideabot-web-… │ Running cmd: docker build --target dev -f packages/frontend/Containerfile -t $EXPECTED_REF . && docker save $EXPECTED_REF | docker exec -i microshift skopeo copy docker-archive:/dev/stdin containers-storage:$EXPECTED_REF
ideabot-loca… │
ideabot-loca… │ Attaching to existing pod (ideabot-local-path-provisioner-58d655b8-s6r2g). Only new logs will be streamed.
ideabot-gate… │ #0 building with "default" instance using docker driver
ideabot-gate… │
ideabot-gate… │ #1 [internal] load build definition from Containerfile
ideabot-gate… │ #1 transferring dockerfile: 1.64kB done
ideabot-gate… │ #1 DONE 0.0s
ideabot-gate… │
ideabot-gate… │ #2 [internal] load metadata for registry.access.redhat.com/ubi9/nodejs-22@sha256:0fdb6844ce7a2a2e5d3d6c69b8023e7be72ddf992ade5ca26e1d1d1924121454
ideabot-gate… │ #2 DONE 0.0s
ideabot-gate… │
ideabot-gate… │ #3 [internal] load .dockerignore
ideabot-gate… │ #3 transferring context: 2B done
ideabot-gate… │ #3 DONE 0.0s
ideabot-gate… │
ideabot-gate… │ #4 [internal] load build context
ideabot-web-… │ #0 building with "default" instance using docker driver
ideabot-web-… │
ideabot-web-… │ #1 [internal] load build definition from Containerfile
ideabot-web-… │ #1 transferring dockerfile: 1.42kB done
ideabot-web-… │ #1 DONE 0.1s
ideabot-web-… │
ideabot-web-… │ #2 [internal] load metadata for registry.access.redhat.com/ubi9/nodejs-22@sha256:0fdb6844ce7a2a2e5d3d6c69b8023e7be72ddf992ade5ca26e1d1d1924121454
ideabot-web-… │ #2 DONE 0.0s
ideabot-toke… │ #0 building with "default" instance using docker driver
ideabot-toke… │
ideabot-toke… │ #1 [internal] load build definition from Containerfile
ideabot-toke… │ #1 transferring dockerfile: 1.72kB done
ideabot-toke… │ #1 DONE 0.1s
ideabot-toke… │
ideabot-toke… │ #2 [internal] load metadata for registry.access.redhat.com/ubi9/nodejs-22@sha256:0fdb6844ce7a2a2e5d3d6c69b8023e7be72ddf992ade5ca26e1d1d1924121454
ideabot-toke… │ #2 DONE 0.0s
ideabot-gate… │ #4 transferring context: 22.89kB done
ideabot-gate… │ #4 DONE 0.0s
ideabot-gate… │
ideabot-gate… │ #5 [build 1/9] FROM registry.access.redhat.com/ubi9/nodejs-22@sha256:0fdb6844ce7a2a2e5d3d6c69b8023e7be72ddf992ade5ca26e1d1d1924121454
ideabot-gate… │ #5 resolve registry.access.redhat.com/ubi9/nodejs-22@sha256:0fdb6844ce7a2a2e5d3d6c69b8023e7be72ddf992ade5ca26e1d1d1924121454 0.0s done
ideabot-gate… │ #5 DONE 0.0s
ideabot-gate… │
ideabot-gate… │ #6 [build 4/9] COPY packages/core/package.json packages/core/
ideabot-gate… │ #6 CACHED
ideabot-gate… │
ideabot-gate… │ #7 [build 5/9] COPY packages/gateway/package.json packages/gateway/
ideabot-gate… │ #7 CACHED
ideabot-gate… │
ideabot-gate… │ #8 [build 8/9] RUN npm run build --workspace=packages/core
ideabot-gate… │ #8 CACHED
ideabot-gate… │
ideabot-gate… │ #9 [build 2/9] WORKDIR /opt/app-root/src
ideabot-gate… │ #9 CACHED
ideabot-gate… │
ideabot-gate… │ #10 [build 6/9] RUN npm ci --ignore-scripts --workspace=packages/core --workspace=packages/gateway --include-workspace-root
ideabot-gate… │ #10 CACHED
ideabot-gate… │
ideabot-gate… │ #11 [build 7/9] COPY packages/core/ packages/core/
ideabot-gate… │ #11 CACHED
ideabot-gate… │
ideabot-gate… │ #12 [build 3/9] COPY package.json package-lock.json tsconfig.json ./
ideabot-gate… │ #12 CACHED
ideabot-gate… │
ideabot-gate… │ #13 [build 9/9] COPY packages/gateway/ packages/gateway/
ideabot-gate… │ #13 CACHED
ideabot-gate… │
ideabot-gate… │ #14 exporting to image
ideabot-gate… │ #14 exporting layers done
ideabot-gate… │ #14 exporting manifest sha256:9e7e5d13ee1db787d4355e72eba2f5faaa2f29f88b84fca519e6dc25d2008833 done
ideabot-gate… │ #14 exporting config sha256:75b0961227204f64434cadc0a43f496745940d497a2ec9357f25f02fcfe5e7d5 done
ideabot-gate… │ #14 exporting attestation manifest sha256:d5249aaa624860b4c8d82c809b8bb971d93e1224c9544e2be07273d99b7a7a7a 0.0s done
ideabot-gate… │ #14 exporting manifest list sha256:72f4c4ecb24f636ac887ef6f11094db1781da6de2fd6004c0df4ef8147542b41 0.0s done
ideabot-gate… │ #14 naming to localhost/ideabot-gateway:tilt-build-1779894717 done
ideabot-gate… │ #14 unpacking to localhost/ideabot-gateway:tilt-build-1779894717 done
ideabot-toke… │
ideabot-toke… │ #3 [build 1/9] FROM registry.access.redhat.com/ubi9/nodejs-22@sha256:0fdb6844ce7a2a2e5d3d6c69b8023e7be72ddf992ade5ca26e1d1d1924121454
ideabot-toke… │ #3 resolve registry.access.redhat.com/ubi9/nodejs-22@sha256:0fdb6844ce7a2a2e5d3d6c69b8023e7be72ddf992ade5ca26e1d1d1924121454 0.0s done
ideabot-toke… │ #3 DONE 0.0s
ideabot-toke… │
ideabot-toke… │ #4 [internal] load .dockerignore
ideabot-toke… │ #4 transferring context: 2B done
ideabot-toke… │ #4 DONE 0.1s
ideabot-toke… │
ideabot-toke… │ #5 [internal] load build context
ideabot-web-… │
ideabot-web-… │ #3 [build 1/9] FROM registry.access.redhat.com/ubi9/nodejs-22@sha256:0fdb6844ce7a2a2e5d3d6c69b8023e7be72ddf992ade5ca26e1d1d1924121454
ideabot-web-… │ #3 resolve registry.access.redhat.com/ubi9/nodejs-22@sha256:0fdb6844ce7a2a2e5d3d6c69b8023e7be72ddf992ade5ca26e1d1d1924121454 0.0s done
ideabot-web-… │ #3 DONE 0.0s
ideabot-web-… │
ideabot-web-… │ #4 [internal] load .dockerignore
ideabot-web-… │ #4 transferring context: 2B done
ideabot-web-… │ #4 DONE 0.1s
ideabot-web-… │
ideabot-web-… │ #5 [internal] load build context
ideabot-web-… │ #5 transferring context: 5.31MB 0.1s done
ideabot-gate… │ #14 DONE 0.1s
ideabot-toke… │ #5 transferring context: 3.47MB 0.0s done
ideabot-toke… │ #5 DONE 0.1s
ideabot-toke… │
ideabot-toke… │ #6 [build 4/9] COPY packages/core/package.json packages/core/
ideabot-toke… │ #6 CACHED
ideabot-toke… │
ideabot-toke… │ #7 [build 2/9] WORKDIR /opt/app-root/src
ideabot-toke… │ #7 CACHED
ideabot-toke… │
ideabot-toke… │ #8 [build 3/9] COPY package.json package-lock.json tsconfig.json ./
ideabot-toke… │ #8 CACHED
ideabot-toke… │
ideabot-toke… │ #9 [build 4/9] COPY packages/core/package.json packages/core/
ideabot-toke… │ #9 CACHED
ideabot-toke… │
ideabot-toke… │ #10 [build 5/9] COPY packages/token-service/package.json packages/token-service/
ideabot-web-… │ #5 DONE 0.1s
ideabot-web-… │
ideabot-web-… │ #6 [build 4/9] COPY packages/core/package.json packages/core/
ideabot-web-… │ #6 CACHED
ideabot-web-… │
ideabot-web-… │ #7 [build 4/9] COPY packages/core/package.json packages/core/
ideabot-web-… │ #7 CACHED
ideabot-web-… │
ideabot-web-… │ #8 [build 2/9] WORKDIR /opt/app-root/src
ideabot-web-… │ #8 CACHED
ideabot-web-… │
ideabot-web-… │ #9 [build 3/9] COPY package.json package-lock.json tsconfig.json ./
ideabot-web-… │ #9 CACHED
ideabot-web-… │
ideabot-web-… │ #10 [build 5/9] COPY packages/frontend/package.json packages/frontend/
ideabot-toke… │ #10 DONE 0.5s
ideabot-web-… │ #10 DONE 0.5s
ideabot-toke… │
ideabot-toke… │ #11 [build 6/9] RUN npm ci --ignore-scripts --workspace=packages/core --workspace=packages/token-service --include-workspace-root
ideabot-web-… │
ideabot-web-… │ #11 [build 6/9] RUN npm ci --ignore-scripts --workspace=packages/core --workspace=packages/frontend --include-workspace-root
[Docker Prune] removed 36 caches, reclaimed 1.319GB
ideabot-toke… │ #11 7.275
ideabot-toke… │ #11 7.275 added 452 packages, and audited 455 packages in 7s
ideabot-toke… │ #11 7.275
ideabot-toke… │ #11 7.275 156 packages are looking for funding
ideabot-toke… │ #11 7.275 run `npm fund` for details
ideabot-toke… │ #11 7.279
ideabot-toke… │ #11 7.279 2 moderate severity vulnerabilities
ideabot-toke… │ #11 7.279
ideabot-toke… │ #11 7.279 To address all issues, run:
ideabot-toke… │ #11 7.279 npm audit fix
ideabot-toke… │ #11 7.279
ideabot-toke… │ #11 7.279 Run `npm audit` for details.
ideabot-web-… │ #11 7.719 npm warn deprecated uuid@8.3.2: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).
ideabot-toke… │ #11 DONE 8.6s
ideabot-toke… │
ideabot-toke… │ #12 [build 7/9] COPY packages/core/ packages/core/
ideabot-toke… │ #12 DONE 0.6s
ideabot-toke… │
ideabot-toke… │ #13 [build 8/9] RUN npm run build --workspace=packages/core
ideabot-toke… │ #13 0.460
ideabot-toke… │ #13 0.460 > @hermes/core@0.1.0 build
ideabot-toke… │ #13 0.460 > tsc
ideabot-toke… │ #13 0.460
ideabot-gate… │ Getting image source signatures
ideabot-gate… │ Copying blob sha256:3975086f238098769f7c270e0532d913ae17cf5f7cc0ad076b549ccb807848c8
ideabot-gate… │ Copying blob sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
ideabot-gate… │ Copying blob sha256:e367f7f869fb7bec2f4b7126c0d460410e76811c9320526af6c34e82fadff68c
ideabot-gate… │ Copying blob sha256:d06bec56648525c4e177fb5af41ade4557d20a2377b9785dc99efb4f1e8799b2
ideabot-gate… │ Copying blob sha256:bf32c26795be3cb60d1a4300e7e2c57283f5994f5e9058925e8c1db4054f52e2
ideabot-gate… │ Copying blob sha256:f495472e6eb0103719df3300368ca80724327ce26a6280815ce51a12b817242e
ideabot-gate… │ Copying blob sha256:b6bda20877e2bd6c9a74925458627bf61ea3909ab8504a1059a155769145e57c
ideabot-gate… │ Copying blob sha256:52ab82ee639efdfc74e9def567c12cfdb8925edb8bb02e26c32462369e969b35
ideabot-gate… │ Copying blob sha256:1ea52d28b68cfd8711237bbd3e3eab56970a12c4a336b03cc90876cc9c02f278
ideabot-gate… │ Copying blob sha256:04ba574e42e4b00d659bfbc96136efac19add0631e4c70cc8b7103ce901d8a69
ideabot-gate… │ Copying blob sha256:3a5db6a7b952e58b005cf7a4141d5d8a61af456be592f6949e9175b09fbb164a
ideabot-gate… │ Copying config sha256:75b0961227204f64434cadc0a43f496745940d497a2ec9357f25f02fcfe5e7d5
ideabot-gate… │ Writing manifest to image destination
ideabot-gate… │
ideabot-gate… │ STEP 2/3 — Pushing localhost/ideabot-gateway:tilt-build-1779894717
ideabot-gate… │ Skipping push: custom_build() configured to handle push itself
ideabot-gate… │
ideabot-gate… │ STEP 3/3 — Deploying
ideabot-gate… │ Applying YAML to cluster
ideabot-gate… │ Objects applied to cluster:
ideabot-gate… │ → ideabot-gateway-keycloak:configmap
ideabot-gate… │ → ideabot-env:configmap
ideabot-gate… │ → ideabot-credentials:secret
ideabot-gate… │ → ideabot-gateway:service
ideabot-gate… │ → ideabot-gateway:deployment
ideabot-gate… │
ideabot-gate… │ Step 1 - 11.83s (Building Custom Build: [localhost/ideabot-gateway])
ideabot-gate… │ Step 2 - 0.00s (Pushing localhost/ideabot-gateway:tilt-build-1779894717)
ideabot-gate… │ Step 3 - 0.04s (Deploying)
ideabot-gate… │ DONE IN: 11.87s
ideabot-gate… │
ideabot-post… │
ideabot-post… │ Initial Build
ideabot-post… │ STEP 1/1 — Deploying
ideabot-post… │ Applying YAML to cluster
ideabot-gate… │
ideabot-gate… │ Tracking new pod rollout (ideabot-gateway-d8c458f86-xmf2f):
ideabot-gate… │ ┊ Scheduled - (…) Pending
ideabot-gate… │ ┊ Initialized - (…) Pending
ideabot-gate… │ ┊ Ready - (…) Pending
ideabot-post… │ Objects applied to cluster:
ideabot-post… │ → ideabot-postgresql:persistentvolumeclaim
ideabot-post… │ → ideabot-db-credentials:secret
ideabot-post… │ → ideabot-postgresql:service
ideabot-post… │ → ideabot-postgresql:deployment
ideabot-post… │
ideabot-post… │ Step 1 - 0.02s (Deploying)
ideabot-post… │ DONE IN: 0.02s
ideabot-post… │
ideabot-migr… │
ideabot-migr… │ Initial Build
ideabot-post… │
ideabot-post… │ Attaching to existing pod (ideabot-postgresql-79b7466d54-4lqzv). Only new logs will be streamed.
ideabot-migr… │ STEP 1/1 — Deploying
ideabot-migr… │ Applying YAML to cluster
ideabot-post… │ 2026-05-27 15:12:03.020 UTC [16704] FATAL: role "postgres" does not exist
ideabot-migr… │ Objects applied to cluster:
ideabot-migr… │ → ideabot-migrations:configmap
ideabot-migr… │ → ideabot-migration-1:job
ideabot-migr… │
ideabot-migr… │ Step 1 - 0.01s (Deploying)
ideabot-migr… │ DONE IN: 0.01s
ideabot-migr… │
ideabot-migr… │
ideabot-migr… │ Tracking new pod rollout (ideabot-migration-1-dbh9r):
ideabot-migr… │ ┊ Scheduled - (…) Pending
ideabot-migr… │ ┊ Initialized - (…) Pending
ideabot-migr… │ ┊ Ready - (…) Pending
ideabot-gate… │ [event: pod ideabot-gateway-d8c458f86-xmf2f] Container image "localhost/ideabot-gateway:tilt-build-1779894717" already present on machine
ideabot-migr… │ [event: pod ideabot-migration-1-dbh9r] Container image "registry.access.redhat.com/hi/postgresql:18" already present on machine
ideabot-post… │ 2026-05-27 15:12:09.928 UTC [16705] ERROR: relation "sessions" already exists
ideabot-post… │ 2026-05-27 15:12:09.928 UTC [16705] STATEMENT: CREATE TABLE sessions (
ideabot-post… │ session_id TEXT PRIMARY KEY,
ideabot-post… │ user_id TEXT NOT NULL,
ideabot-post… │ sandbox_claim TEXT,
ideabot-post… │ title TEXT,
ideabot-post… │ phase TEXT DEFAULT 'discovery' NOT NULL,
ideabot-post… │ status TEXT DEFAULT 'active' NOT NULL,
ideabot-post… │ last_activity TIMESTAMPTZ DEFAULT now() NOT NULL,
ideabot-post… │ created_at TIMESTAMPTZ DEFAULT now() NOT NULL,
ideabot-post… │ submitted_issue TEXT,
ideabot-post… │ last_submitted_snapshot JSONB,
ideabot-post… │ last_synced_at TIMESTAMPTZ,
ideabot-post… │ CONSTRAINT sessions_status_check
ideabot-post… │ CHECK (status IN ('active', 'sleeping', 'deleted'))
ideabot-post… │ );
ideabot-post… │ 2026-05-27 15:12:09.929 UTC [16705] ERROR: relation "idx_sessions_user_id" already exists
ideabot-post… │ 2026-05-27 15:12:09.929 UTC [16705] STATEMENT: CREATE INDEX idx_sessions_user_id ON sessions(user_id);
ideabot-post… │ 2026-05-27 15:12:09.929 UTC [16705] ERROR: relation "idx_sessions_last_activity" already exists
ideabot-post… │ 2026-05-27 15:12:09.929 UTC [16705] STATEMENT: CREATE INDEX idx_sessions_last_activity ON sessions(last_activity DESC);
ideabot-post… │ 2026-05-27 15:12:09.930 UTC [16705] ERROR: relation "idx_sessions_status" already exists
ideabot-post… │ 2026-05-27 15:12:09.930 UTC [16705] STATEMENT: CREATE INDEX idx_sessions_status ON sessions(status);
ideabot-post… │ 2026-05-27 15:12:09.931 UTC [16705] ERROR: relation "feedback_notifications" already exists
ideabot-post… │ 2026-05-27 15:12:09.931 UTC [16705] STATEMENT: CREATE TABLE feedback_notifications (
ideabot-post… │ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
ideabot-post… │ session_id TEXT NOT NULL REFERENCES sessions(session_id),
ideabot-post… │ type TEXT NOT NULL,
ideabot-post… │ summary TEXT NOT NULL,
ideabot-post… │ jira_author TEXT,
ideabot-post… │ jira_updated_at TIMESTAMPTZ NOT NULL,
ideabot-post… │ read BOOLEAN DEFAULT false NOT NULL,
ideabot-post… │ created_at TIMESTAMPTZ DEFAULT now() NOT NULL
ideabot-post… │ );
ideabot-post… │ 2026-05-27 15:12:09.931 UTC [16705] ERROR: relation "idx_feedback_session_id" already exists
ideabot-post… │ 2026-05-27 15:12:09.931 UTC [16705] STATEMENT: CREATE INDEX idx_feedback_session_id ON feedback_notifications(session_id)
ideabot-post… │ WHERE read = false;
ideabot-toke… │ #13 DONE 2.8s
ideabot-migr… │ Running migrations against ideabot-postgresql:5432/ideabot
ideabot-migr… │ Applying: 001-initial-schema.sql
ideabot-migr… │ ERROR: relation "sessions" already exists
ideabot-migr… │ ERROR: relation "idx_sessions_user_id" already exists
ideabot-migr… │ ERROR: relation "idx_sessions_last_activity" already exists
ideabot-migr… │ ERROR: relation "idx_sessions_status" already exists
ideabot-migr… │ ERROR: relation "feedback_notifications" already exists
ideabot-migr… │ ERROR: relation "idx_feedback_session_id" already exists
ideabot-migr… │ All migrations applied
ideabot-toke… │
ideabot-toke… │ #14 [build 9/9] COPY packages/token-service/ packages/token-service/
ideabot-toke… │ #14 DONE 0.2s
ideabot-toke… │
ideabot-toke… │ #15 exporting to image
ideabot-toke… │ #15 exporting layers
ideabot-gate… │ Gateway listening on port 8080
ideabot-post… │ 2026-05-27 15:12:13.015 UTC [16707] FATAL: role "postgres" does not exist
ideabot-web-… │ #11 19.08
ideabot-web-… │ #11 19.08 added 906 packages, and audited 909 packages in 19s
ideabot-web-… │ #11 19.08
ideabot-web-… │ #11 19.08 287 packages are looking for funding
ideabot-web-… │ #11 19.08 run `npm fund` for details
ideabot-web-… │ #11 19.09
ideabot-web-… │ #11 19.09 11 vulnerabilities (8 moderate, 3 high)
ideabot-web-… │ #11 19.09
ideabot-web-… │ #11 19.09 To address issues that do not require attention, run:
ideabot-web-… │ #11 19.09 npm audit fix
ideabot-web-… │ #11 19.09
ideabot-web-… │ #11 19.09 To address all issues (including breaking changes), run:
ideabot-web-… │ #11 19.09 npm audit fix --force
ideabot-web-… │ #11 19.09
ideabot-web-… │ #11 19.09 Run `npm audit` for details.
ideabot-web-… │ #11 DONE 19.7s
ideabot-web-… │
ideabot-web-… │ #12 [build 7/9] COPY packages/core/ packages/core/
ideabot-toke… │ #15 exporting layers 8.0s done
ideabot-web-… │ #12 DONE 0.7s
ideabot-toke… │ #15 exporting manifest sha256:385553f306977b31b7d99c8ed417a299bab31c7a358a17eed7d8c21802b8c8ad 0.0s done
ideabot-toke… │ #15 exporting config sha256:da6c6bdede113f5d8f8f004ca682fcbdcc77be9e68a5951ce9019a9b38081a4a 0.0s done
ideabot-toke… │ #15 exporting attestation manifest sha256:472851fdb7a8226479798e817541bac82ff17a8e790054c9d9661a2d1b8c5297 0.0s done
ideabot-toke… │ #15 exporting manifest list sha256:1b4929f62925fa94e98798ca54eb842a0dfbf16ecde6e072849742af8445cb59 done
ideabot-toke… │ #15 naming to localhost/ideabot-token-service:tilt-build-1779894717 done
ideabot-toke… │ #15 unpacking to localhost/ideabot-token-service:tilt-build-1779894717
ideabot-web-… │
ideabot-web-… │ #13 [build 8/9] RUN npm run build --workspace=packages/core
ideabot-web-… │ #13 0.451
ideabot-web-… │ #13 0.451 > @hermes/core@0.1.0 build
ideabot-web-… │ #13 0.451 > tsc
ideabot-web-… │ #13 0.451
ideabot-toke… │ #15 unpacking to localhost/ideabot-token-service:tilt-build-1779894717 2.5s done
ideabot-toke… │ #15 DONE 10.6s
ideabot-web-… │ #13 DONE 2.6s
ideabot-web-… │
ideabot-web-… │ #14 [build 9/9] COPY packages/frontend/ packages/frontend/
ideabot-web-… │ #14 DONE 0.1s
ideabot-web-… │
ideabot-web-… │ #15 [dev 1/1] WORKDIR /opt/app-root/src/packages/frontend
ideabot-web-… │ #15 DONE 0.0s
ideabot-web-… │
ideabot-web-… │ #16 exporting to image
ideabot-gate… │ ┊ Scheduled - <1s
ideabot-gate… │ ┊ Initialized - <1s
ideabot-gate… │ ┊ Ready - 12s
ideabot-web-… │ #16 exporting layers
ideabot-gate… │
ideabot-post… │ 2026-05-27 15:12:23.010 UTC [16711] FATAL: role "postgres" does not exist
ideabot-toke… │ Getting image source signatures
ideabot-toke… │ Copying blob sha256:3975086f238098769f7c270e0532d913ae17cf5f7cc0ad076b549ccb807848c8
ideabot-toke… │ Copying blob sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
ideabot-toke… │ Copying blob sha256:f495472e6eb0103719df3300368ca80724327ce26a6280815ce51a12b817242e
ideabot-toke… │ Copying blob sha256:d06bec56648525c4e177fb5af41ade4557d20a2377b9785dc99efb4f1e8799b2
ideabot-toke… │ Copying blob sha256:bf32c26795be3cb60d1a4300e7e2c57283f5994f5e9058925e8c1db4054f52e2
ideabot-toke… │ Copying blob sha256:e367f7f869fb7bec2f4b7126c0d460410e76811c9320526af6c34e82fadff68c
ideabot-toke… │ Copying blob sha256:9976f204f6b2d34d2aef524a80d7f50a98d6e54d61602e9649ef32d88cd53c46
ideabot-toke… │ Copying blob sha256:8ad7eb933a0075b5544e3669031a1dd8d1091bbfe6faaab70663f27985318714
ideabot-toke… │ Copying blob sha256:27282954ac35eafdec18dd743e818e4802be1166fd8f9457bffbd16c7ab74e90
ideabot-toke… │ Copying blob sha256:8ceb5951fec89ac7b0736837d2d4029188bf90ee1ab31cf3527dc8486a97b57f
ideabot-toke… │ Copying blob sha256:966965e9e4ab4e52c4879cc208d0a30f12580762f7ee9ab642c12168a497c513
ideabot-post… │ 2026-05-27 15:12:33.008 UTC [16713] FATAL: role "postgres" does not exist
ideabot-toke… │ Copying config sha256:da6c6bdede113f5d8f8f004ca682fcbdcc77be9e68a5951ce9019a9b38081a4a
ideabot-toke… │ Writing manifest to image destination
ideabot-toke… │
ideabot-toke… │ STEP 2/3 — Pushing localhost/ideabot-token-service:tilt-build-1779894717
ideabot-toke… │ Skipping push: custom_build() configured to handle push itself
ideabot-toke… │
ideabot-toke… │ STEP 3/3 — Deploying
ideabot-toke… │ Applying YAML to cluster
ideabot-toke… │ Objects applied to cluster:
ideabot-toke… │ → ideabot-token-service:service
ideabot-toke… │ → ideabot-token-service:deployment
ideabot-toke… │
ideabot-toke… │ Step 1 - 35.99s (Building Custom Build: [localhost/ideabot-token-service])
ideabot-toke… │ Step 2 - 0.00s (Pushing localhost/ideabot-token-service:tilt-build-1779894717)
ideabot-toke… │ Step 3 - 0.01s (Deploying)
ideabot-toke… │ DONE IN: 36.00s
ideabot-toke… │
ideabot-toke… │
ideabot-toke… │ Tracking new pod rollout (ideabot-token-service-549797d6f6-txqmm):
ideabot-toke… │ ┊ Scheduled - (…) Pending
ideabot-toke… │ ┊ Initialized - (…) Pending
ideabot-toke… │ ┊ Ready - (…) Pending
ideabot-toke… │ [event: pod ideabot-token-service-549797d6f6-txqmm] Container image "localhost/ideabot-token-service:tilt-build-1779894717" already present on machine
ideabot-toke… │ Token Service listening on port 3001
ideabot-web-… │ #16 exporting layers 20.7s done
ideabot-web-… │ #16 exporting manifest sha256:890bb94a032ee75853c06b0aee7b2e614c2af52a2171b78dff7f414be96c7ab7 done
ideabot-web-… │ #16 exporting config sha256:2cae53e28e88caced104253a5de338301aae8864d8de978d1f247833db8dd36f done
ideabot-web-… │ #16 exporting attestation manifest sha256:50167c42170219a45f4f4eff1c1c705daeccd04939733d73de1d866525257f19 0.0s done
ideabot-web-… │ #16 exporting manifest list sha256:8c2983cec82ab7bdc3627a44868e677bf161f5895211f80a4e4a6986e74e1c7c done
ideabot-web-… │ #16 naming to localhost/ideabot-web-ui:tilt-build-1779894717 done
ideabot-web-… │ #16 unpacking to localhost/ideabot-web-ui:tilt-build-1779894717
ideabot-post… │ 2026-05-27 15:12:43.009 UTC [16716] FATAL: role "postgres" does not exist
ideabot-toke… │ ┊ Scheduled - <1s
ideabot-toke… │ ┊ Initialized - <1s
ideabot-toke… │ ┊ Ready - 12s
ideabot-toke… │
ideabot-web-… │ #16 unpacking to localhost/ideabot-web-ui:tilt-build-1779894717 10.7s done
ideabot-post… │ 2026-05-27 15:12:53.013 UTC [16718] FATAL: role "postgres" does not exist
ideabot-web-… │ #16 DONE 31.5s
ideabot-post… │ 2026-05-27 15:13:03.008 UTC [16721] FATAL: role "postgres" does not exist
ideabot-web-… │ Getting image source signatures
ideabot-web-… │ Copying blob sha256:3975086f238098769f7c270e0532d913ae17cf5f7cc0ad076b549ccb807848c8
ideabot-web-… │ Copying blob sha256:bf32c26795be3cb60d1a4300e7e2c57283f5994f5e9058925e8c1db4054f52e2
ideabot-web-… │ Copying blob sha256:d06bec56648525c4e177fb5af41ade4557d20a2377b9785dc99efb4f1e8799b2
ideabot-web-… │ Copying blob sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
ideabot-web-… │ Copying blob sha256:f495472e6eb0103719df3300368ca80724327ce26a6280815ce51a12b817242e
ideabot-web-… │ Copying blob sha256:e367f7f869fb7bec2f4b7126c0d460410e76811c9320526af6c34e82fadff68c
ideabot-web-… │ Copying blob sha256:ad48dd061a924b2ef8d0716f8de2ae255a7baa3117a7f4a4a85dffa1570c83ea
ideabot-web-… │ Copying blob sha256:a916b513f0e3750911a791333ac72040ef9f4e23d3061e513ef3122946f4befe
ideabot-web-… │ Copying blob sha256:fd3aab9d7b314a0ab9ecef9f9fae4329cc6cb5a57ef16223269d66fd2a3f358e
ideabot-web-… │ Copying blob sha256:6bca7b68126d981fe6bc4881bd4176347c338a6145adc6a2408f4284f29369c7
ideabot-web-… │ Copying blob sha256:d8f71771048c45300656efb6fcc4f57b0b27185ccbb55039150bfc7397832aa6
ideabot-web-… │ Copying blob sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
ideabot-post… │ 2026-05-27 15:13:13.008 UTC [16723] FATAL: role "postgres" does not exist
ideabot-web-… │ Copying config sha256:2cae53e28e88caced104253a5de338301aae8864d8de978d1f247833db8dd36f
ideabot-web-… │ Writing manifest to image destination
ideabot-web-… │
ideabot-web-… │ STEP 2/3 — Pushing localhost/ideabot-web-ui:tilt-build-1779894717
ideabot-web-… │ Skipping push: custom_build() configured to handle push itself
ideabot-web-… │
ideabot-web-… │ STEP 3/3 — Deploying
ideabot-web-… │ Applying YAML to cluster
ideabot-web-… │ Objects applied to cluster:
ideabot-web-… │ → ideabot-nginx:configmap
ideabot-web-… │ → ideabot-web-ui:service
ideabot-web-… │ → ideabot-web-ui:deployment
ideabot-web-… │
ideabot-web-… │ Step 1 - 78.32s (Building Custom Build: [localhost/ideabot-web-ui])
ideabot-web-… │ Step 2 - 0.00s (Pushing localhost/ideabot-web-ui:tilt-build-1779894717)
ideabot-web-… │ Step 3 - 0.02s (Deploying)
ideabot-web-… │ DONE IN: 78.34s
ideabot-web-… │
ideabot-web-… │
ideabot-web-… │ Tracking new pod rollout (ideabot-web-ui-56db68859b-dzdkj):
ideabot-web-… │ ┊ Scheduled - (…) Pending
ideabot-web-… │ ┊ Initialized - (…) Pending
ideabot-web-… │ ┊ Ready - (…) Pending
ideabot-web-… │ [event: pod ideabot-web-ui-56db68859b-dzdkj] Container image "localhost/ideabot-web-ui:tilt-build-1779894717" already present on machine
ideabot-web-… │ <i> [webpack-dev-server] [HPM] Proxy created: /api -> http://ideabot-gateway:8080
ideabot-web-… │ <i> [webpack-dev-server] [HPM] Proxy created: /realms,/resources -> http://ideabot-keycloak:8080
ideabot-web-… │ <i> [webpack-dev-server] Project is running at:
ideabot-web-… │ <i> [webpack-dev-server] Loopback: http://localhost:8080/, http://[::1]:8080/
ideabot-web-… │ <i> [webpack-dev-server] On Your Network (IPv4): http://10.42.0.41:8080/
ideabot-web-… │ <i> [webpack-dev-server] Content not from webpack is served from '/opt/app-root/src/packages/frontend/public' directory
ideabot-web-… │ <i> [webpack-dev-server] 404s will fallback to '/index.html'
ideabot-post… │ 2026-05-27 15:13:23.010 UTC [16726] FATAL: role "postgres" does not exist
ideabot-web-… │ assets by path components/ 2.87 KiB 14 assets
ideabot-web-… │ assets by info 4.69 MiB [immutable] 9 assets
ideabot-web-… │ assets by path stores/ 3.42 KiB 8 assets
ideabot-web-… │ assets by path api/ 1.19 KiB
ideabot-web-… │ assets by path api/*.map 728 bytes 2 assets
ideabot-web-… │ assets by path api/*.ts 492 bytes 2 assets
ideabot-web-… │ assets by path pages/ 638 bytes 4 assets
ideabot-web-… │ assets by path *.map 326 bytes
ideabot-web-… │ asset App.d.ts.map 177 bytes [emitted]
ideabot-web-… │ asset index.d.ts.map 149 bytes [emitted]
ideabot-web-… │ assets by path *.ts 233 bytes
ideabot-web-… │ asset index.d.ts 137 bytes [emitted]
ideabot-web-… │ asset App.d.ts 96 bytes [emitted]
ideabot-web-… │ asset ideabot-icon.png 36.1 KiB [emitted] [from: public/ideabot-icon.png] [copied]
ideabot-web-… │ asset index.html 369 bytes [emitted]
ideabot-web-… │ orphan modules 1.37 MiB [orphan] 534 modules
ideabot-web-… │ runtime modules 29.3 KiB 15 modules
ideabot-web-… │ cacheable modules 3.45 MiB (javascript) 237 KiB (asset) 422 modules
ideabot-web-… │ webpack 5.106.2 compiled successfully in 5092 ms
--- (tilt up stopped after demo capture) ---
All 7 resources built and deployed successfully. Tilt watches for source file changes and automatically rebuilds — for files listed in live_update_src, it syncs directly into the running container without a full image rebuild.
kubectl get deploymentsNAME READY UP-TO-DATE AVAILABLE AGE
ideabot-gateway 1/1 1 1 18h
ideabot-keycloak 1/1 1 1 18h
ideabot-local-path-provisioner 1/1 1 1 18h
ideabot-postgresql 1/1 1 1 18h
ideabot-token-service 1/1 1 1 18h
ideabot-web-ui 1/1 1 1 18h
kubectl get servicesNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ideabot-gateway ClusterIP 10.43.161.21 <none> 8080/TCP 18h
ideabot-keycloak ClusterIP 10.43.218.170 <none> 8080/TCP 18h
ideabot-postgresql ClusterIP 10.43.89.42 <none> 5432/TCP 18h
ideabot-token-service ClusterIP 10.43.84.143 <none> 3001/TCP 18h
ideabot-web-ui ClusterIP 10.43.104.24 <none> 8080/TCP 18h
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 20h
kubectl logs deployment/ideabot-gateway --tail=5 2>&1Gateway listening on port 8080
All deployments are 1/1 READY. The gateway is listening on port 8080, and services are exposed as ClusterIP within the cluster. The MINC container maps port 9080 → 80 (ingress router) and port 9443 → 443 for external access.
When you're done developing, tear down in reverse order:
tilt down 2>&1 | tail -3→ Role/ideabot-local-path-provisioner
→ ServiceAccount/ideabot-local-path-provisioner
→ StorageClass/local-path
To delete the MINC cluster entirely:
minc delete --provider dockerThis removes the MicroShift container and its named volume. The cluster can be recreated at any time with minc create --provider docker --disable-overlay-cache.
The local dev workflow is:
minc create --provider docker --disable-overlay-cache— spin up MicroShift in a Docker containertilt up— build images, load into CRI-O, deploy Helm chart, and watch for changes- Edit code — Tilt detects changes and live-updates containers (or rebuilds if needed)
tilt down— remove Kubernetes resourcesminc delete --provider docker— tear down the cluster
Everything runs inside the devcontainer. No cloud cluster, no registry, no manual image pushes.