Skip to content

Commit e59bfd9

Browse files
Merge branch 'main' into feat/dashboard-fleet-merge
2 parents 3c99af7 + 2a6ddb9 commit e59bfd9

52 files changed

Lines changed: 3627 additions & 1396 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/dependabot.yml

Lines changed: 26 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Dependabot configuration
22
# Docs: https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
3+
#
4+
# Grouping policy: collapse all minor+patch bumps into ONE PR per ecosystem so
5+
# the review queue stays small; majors get their own grouped PR per ecosystem so
6+
# breaking changes still get individual scrutiny.
37

48
version: 2
59
updates:
@@ -19,47 +23,17 @@ updates:
1923
- "dependencies"
2024
- "javascript"
2125
groups:
22-
# Keep TanStack libs in lockstep — they release as a family
23-
tanstack:
26+
npm-minor-patch:
2427
patterns:
25-
- "@tanstack/*"
26-
# Tauri JS bindings
27-
tauri:
28+
- "*"
29+
update-types:
30+
- "minor"
31+
- "patch"
32+
npm-major:
2833
patterns:
29-
- "@tauri-apps/*"
30-
# Test stack
31-
testing:
32-
patterns:
33-
- "vitest"
34-
- "@vitest/*"
35-
- "@testing-library/*"
36-
- "jsdom"
37-
- "@playwright/*"
38-
# Build/lint tooling
39-
tooling:
40-
patterns:
41-
- "@biomejs/*"
42-
- "turbo"
43-
- "vite"
44-
- "@vitejs/*"
45-
- "typescript"
46-
# React core
47-
react:
48-
patterns:
49-
- "react"
50-
- "react-dom"
51-
- "@types/react"
52-
- "@types/react-dom"
53-
# Semantic-release ecosystem
54-
semantic-release:
55-
patterns:
56-
- "semantic-release"
57-
- "@semantic-release/*"
58-
# Commitlint + husky
59-
commit-tooling:
60-
patterns:
61-
- "@commitlint/*"
62-
- "husky"
34+
- "*"
35+
update-types:
36+
- "major"
6337

6438
# ─── Rust / Cargo (Tauri desktop shell) ───────────────────────────────────
6539
- package-ecosystem: "cargo"
@@ -77,16 +51,17 @@ updates:
7751
- "dependencies"
7852
- "rust"
7953
groups:
80-
tauri-core:
54+
cargo-minor-patch:
8155
patterns:
82-
- "tauri"
83-
- "tauri-*"
84-
tokio:
56+
- "*"
57+
update-types:
58+
- "minor"
59+
- "patch"
60+
cargo-major:
8561
patterns:
86-
- "tokio"
87-
- "tokio-*"
88-
- "futures"
89-
- "futures-*"
62+
- "*"
63+
update-types:
64+
- "major"
9065

9166
# ─── GitHub Actions workflow pins ─────────────────────────────────────────
9267
- package-ecosystem: "github-actions"
@@ -103,3 +78,7 @@ updates:
10378
labels:
10479
- "dependencies"
10580
- "github-actions"
81+
groups:
82+
github-actions:
83+
patterns:
84+
- "*"

.github/workflows/docker-publish.yml

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ jobs:
1616
steps:
1717
- uses: actions/checkout@v4
1818

19-
- uses: docker/setup-qemu-action@v3
20-
- uses: docker/setup-buildx-action@v3
19+
- uses: docker/setup-qemu-action@v4
20+
- uses: docker/setup-buildx-action@v4
2121

2222
- uses: docker/login-action@v3
2323
with:
@@ -35,7 +35,7 @@ jobs:
3535
type=raw,value=latest
3636
type=sha,format=short
3737
38-
- uses: docker/build-push-action@v6
38+
- uses: docker/build-push-action@v7
3939
with:
4040
context: .
4141
platforms: linux/amd64,linux/arm64
@@ -44,3 +44,34 @@ jobs:
4444
labels: ${{ steps.meta.outputs.labels }}
4545
cache-from: type=gha
4646
cache-to: type=gha,mode=max
47+
48+
publish-chart:
49+
name: Package & push Helm chart to GHCR
50+
runs-on: ubuntu-latest
51+
needs: [publish]
52+
if: startsWith(github.ref, 'refs/tags/')
53+
steps:
54+
- uses: actions/checkout@v4
55+
56+
- uses: azure/setup-helm@v4
57+
58+
- name: Derive chart version
59+
id: version
60+
run: echo "VERSION=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
61+
62+
- name: Log in to GHCR (Helm OCI)
63+
run: |
64+
echo "${{ secrets.GITHUB_TOKEN }}" | helm registry login ghcr.io \
65+
--username "${{ github.actor }}" \
66+
--password-stdin
67+
68+
- name: Package chart
69+
run: |
70+
helm package charts/openconcho \
71+
--version "${{ steps.version.outputs.VERSION }}" \
72+
--app-version "${{ steps.version.outputs.VERSION }}"
73+
74+
- name: Push chart
75+
run: |
76+
helm push "openconcho-${{ steps.version.outputs.VERSION }}.tgz" \
77+
oci://ghcr.io/${{ github.repository_owner }}/charts

AGENTS.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ Frontend UI for self-hosted Honcho instances — browse memories, peers, session
1616
| `make typecheck` | tsc --noEmit |
1717
| `make test` | Vitest (unit + integration), excludes `e2e/` |
1818
| `make test-e2e` | Playwright e2e (uncached) |
19+
| `make smoke-docker` | Local: build image + hermetic smoke test of the `/api` proxy (Docker required) |
20+
| `make up` | Run the web container from source (dev-forward, builds) at :8080 |
21+
| `make prod` | Run the web container from the published image (pulls `ghcr…:latest`) |
22+
| `make down` | Stop + remove the web container (dev or prod) |
23+
| `make clean` | `down` + remove the locally built image |
1924
| `make check` | lint + typecheck + test |
2025
| `pnpm --filter @openconcho/desktop cargo-check` | Local Rust/Tauri compile check before pushing desktop changes |
2126
| `pnpm --filter @openconcho/web generate:api` | Regen `src/api/schema.d.ts` from `openapi.json` |
@@ -33,6 +38,7 @@ Frontend UI for self-hosted Honcho instances — browse memories, peers, session
3338
| `packages/web/src/test/` | Vitest unit/integration tests + setup |
3439
| `packages/web/e2e/` | Playwright e2e specs |
3540
| `packages/desktop/` | Tauri shell that bundles the built web app |
41+
| `charts/openconcho/` | Helm 3 chart for self-hosting on Kubernetes (OCI artifact on GHCR) |
3642
| `.claude/rules/` | Coding conventions (auto-loaded; stack-agnostic, applies to all agents) |
3743
| `docs/` | Architecture and references |
3844

@@ -64,6 +70,7 @@ Before pushing any change under `packages/desktop/**` or `packages/desktop/src-t
6470
## Key Constraints
6571

6672
- **No hardcoded URLs** — connection config lives in `localStorage` under `openconcho:instances` (multi-instance store; legacy `openconcho:config` is auto-migrated)
73+
- **Web CORS via a same-origin `/api` proxy** — the web build issues all Honcho calls to `/api/*` with an `X-Honcho-Upstream` header (the active instance's URL); nginx (docker) and a Vite middleware (dev) forward server-side. Transport is resolved by `dispatchFor` in `src/lib/dispatch.ts`: web → relative `/api` + header; Tauri → absolute URL + reqwest. Optional `OPENCONCHO_UPSTREAM_ALLOWLIST` guards the proxy when exposed.
6774
- **Local git hooks**`.husky/pre-commit` runs a secret scan + Biome on staged files; `.husky/pre-push` runs `pnpm check`. Your commits and pushes trigger these.
6875
- **TanStack Router flat-route params** — always cast `params` as `as never` at `navigate()` and `<Link>` callsites
6976
- **`framer-motion` Variants typing** — import `type Variants` and annotate objects; never use `as const` on variant objects

CHANGELOG.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,47 @@
1+
# [0.15.0](https://github.com/offendingcommit/openconcho/compare/v0.14.0...v0.15.0) (2026-06-03)
2+
3+
4+
### Bug Fixes
5+
6+
* **helm:** guard tmpfs blocks when empty, cap volume names at 63 chars ([d5a65d7](https://github.com/offendingcommit/openconcho/commit/d5a65d73b59378f5ce39bf76e0572da478cecbda))
7+
* **helm:** pdb mutual exclusion, ingress null rules guard, hpa nil utilization guard ([b4939bd](https://github.com/offendingcommit/openconcho/commit/b4939bd57f2dba5ebca9efcd42901457512e70e4))
8+
* **helm:** pin busybox:1.36, add -T 10 timeout, use --spider, add activeDeadlineSeconds ([8fac5d0](https://github.com/offendingcommit/openconcho/commit/8fac5d060f45b68141917efad4afe499ca2fda56))
9+
* **helm:** use http://json-schema.org/draft-07/schema# for Helm compatibility ([8d41455](https://github.com/offendingcommit/openconcho/commit/8d41455e39db51617d7476e5cc48577eb7fff158))
10+
11+
12+
### Features
13+
14+
* **helm:** add _helpers.tpl with name, label, and imageTag partials ([0268275](https://github.com/offendingcommit/openconcho/commit/02682750ab766851570eae58eb0b92761b98724f))
15+
* **helm:** add Deployment template with read-only FS, tmpfs, probes ([514e1d4](https://github.com/offendingcommit/openconcho/commit/514e1d46c0248bfae5da1f2ceb12ca8799a81468))
16+
* **helm:** add NOTES.txt with access instructions and NetworkPolicy/Ingress warning ([ce211df](https://github.com/offendingcommit/openconcho/commit/ce211df48cc59dfe933eb7a1b1415591b0e9f7fa))
17+
* **helm:** add optional HPA, PDB, and NetworkPolicy templates ([b0b648b](https://github.com/offendingcommit/openconcho/commit/b0b648bdcf64732c0a713bd8e45077c5f1b39ba6))
18+
* **helm:** add optional Ingress template ([9aa106c](https://github.com/offendingcommit/openconcho/commit/9aa106cede7d5719ee2cbc48c1c677491deea568))
19+
* **helm:** add Service and ServiceAccount templates ([ee916ea](https://github.com/offendingcommit/openconcho/commit/ee916eabc485f37cdc56ffbdd8d9004f33f3a7b7))
20+
* **helm:** add test-healthz and test-spa-root helm test jobs ([ee4630e](https://github.com/offendingcommit/openconcho/commit/ee4630e79ca588ee0f9cb167ac0f58ae4b8223cc))
21+
* **helm:** chart scaffold — Chart.yaml, values, schema ([4112270](https://github.com/offendingcommit/openconcho/commit/411227046a3dee125a555a0d1a426afed0e74ec3))
22+
23+
# [0.14.0](https://github.com/offendingcommit/openconcho/compare/v0.13.1...v0.14.0) (2026-06-02)
24+
25+
26+
### Bug Fixes
27+
28+
* **docker:** derive nginx resolver from container DNS ([66b299a](https://github.com/offendingcommit/openconcho/commit/66b299a28e912bc2f8c2922b40292696c4f7d81a))
29+
* **docker:** drop dead HONCHO_UPSTREAM and same-origin default ([a2854ab](https://github.com/offendingcommit/openconcho/commit/a2854ab8ea0a9eec2a06838fb394a0264f7dd80d))
30+
* **web:** enforce upstream allowlist in vite dev proxy ([b4fac95](https://github.com/offendingcommit/openconcho/commit/b4fac95f37da3985dbc4fbf64d04dd509ec86c2c))
31+
* **web:** raise connection-test timeout for cold upstreams ([409d7d8](https://github.com/offendingcommit/openconcho/commit/409d7d8be7f5cc94421dce32a54105ea48bfd44b))
32+
* **web:** strip content-encoding from vite dev proxy responses ([6b602c0](https://github.com/offendingcommit/openconcho/commit/6b602c05bb81721dfc102b3f97112b2cf58d4d60))
33+
34+
35+
### Features
36+
37+
* **docker:** header-driven /api reverse proxy in nginx ([753c978](https://github.com/offendingcommit/openconcho/commit/753c978f56dab61d0c15b25b56ecf438cdc5ae88))
38+
* **docker:** render SSRF allowlist map from env ([0af1ad9](https://github.com/offendingcommit/openconcho/commit/0af1ad923cd2aa61a201d65ce4f19acb13858790))
39+
* **docker:** split compose into dev-forward build and prod pull ([c9bd2db](https://github.com/offendingcommit/openconcho/commit/c9bd2db07d84e0eedffeadcc6f2bc15c628eb251))
40+
* **web:** add dispatchFor transport helper for same-origin proxy ([9945e4c](https://github.com/offendingcommit/openconcho/commit/9945e4cf148aec6fc47bb853e8661c339c52ff32))
41+
* **web:** dev /api proxy middleware mirroring nginx ([ab8a1ba](https://github.com/offendingcommit/openconcho/commit/ab8a1ba866728ff972544c1d912fed59ba03a4a7))
42+
* **web:** route checkConnection and discovery through the proxy ([9893230](https://github.com/offendingcommit/openconcho/commit/9893230cde3d11ce73350bd12fffae236ee9adff))
43+
* **web:** route web build through same-origin /api proxy ([0935099](https://github.com/offendingcommit/openconcho/commit/0935099bc28468a21183f5f03105645f4ac8aa8a))
44+
145
## [0.13.1](https://github.com/offendingcommit/openconcho/compare/v0.13.0...v0.13.1) (2026-05-29)
246

347

Dockerfile

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,10 @@ COPY --chown=101:101 docker/nginx.conf.template /etc/nginx/templates/default.con
3737
# --chmod=0755 so nginx's docker-entrypoint.d actually executes it.
3838
COPY --chown=101:101 --chmod=0755 docker/40-openconcho-config.sh /docker-entrypoint.d/40-openconcho-config.sh
3939

40-
# Defaults target the Honcho service in a typical Compose stack; override per deploy.
41-
ENV HONCHO_UPSTREAM=http://api:8000 \
42-
OPENCONCHO_DEFAULT_HONCHO_URL=same-origin
40+
# Empty default → clean first run (configure the instance in Settings). Override per
41+
# deploy to seed the first instance; the browser routes via /api with an
42+
# X-Honcho-Upstream header. Optional OPENCONCHO_UPSTREAM_ALLOWLIST guards the proxy.
43+
ENV OPENCONCHO_DEFAULT_HONCHO_URL=""
4344

4445
EXPOSE 8080
4546

Makefile

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
.PHONY: bootstrap dev dev-web dev-desktop \
66
build test test-e2e lint lint-fix typecheck check \
7-
ci-web ci-desktop install help
7+
ci-web ci-desktop smoke-docker \
8+
up prod down clean install help
89

910
help:
1011
@grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS=":.*?## "}; {printf " \033[36m%-14s\033[0m %s\n", $$1, $$2}'
@@ -47,5 +48,20 @@ ci-web: ## CI: lint + typecheck + test + build for @openconcho/web
4748
ci-desktop: ## CI: cargo-check for @openconcho/desktop
4849
pnpm ci:desktop
4950

51+
smoke-docker: ## Local: build the image + smoke-test the /api proxy (Docker required)
52+
bash docker/smoke-test.sh
53+
54+
up: ## Run the web container from source (dev profile, builds) at :8080
55+
docker compose --profile dev up -d --build
56+
57+
prod: ## Run the web container from the published image (prod profile, pulls latest)
58+
docker compose --profile prod up -d
59+
60+
down: ## Stop + remove the web container (either profile)
61+
docker compose --profile dev --profile prod down --remove-orphans
62+
63+
clean: down ## down + remove the locally built image
64+
-docker image rm openconcho-web:local
65+
5066
install: ## pnpm install (no playwright)
5167
pnpm install

README.md

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,20 +89,58 @@ pnpm --filter @openconcho/desktop dev
8989

9090
### Docker (web app)
9191

92-
Run the web UI in a container — handy for adding it to a self-hosted Honcho
93-
Compose stack. The image serves the SPA and reverse-proxies the Honcho API under
94-
its own origin, so the browser makes same-origin requests (no CORS to configure).
92+
The container serves the SPA and reverse-proxies the Honcho API under its own
93+
origin: the browser calls `/api` same-origin and names the upstream in an
94+
`X-Honcho-Upstream` header, so there's no browser CORS to configure.
95+
96+
Two Compose modes (the published image is `ghcr.io/offendingcommit/openconcho-web`):
9597

9698
```bash
97-
docker run --rm -p 8080:8080 \
98-
-e HONCHO_UPSTREAM=http://host.docker.internal:8000 \
99-
ghcr.io/offendingcommit/openconcho-web:latest
99+
# Dev-forward — build from this repo and run your local changes:
100+
OPENCONCHO_DEFAULT_HONCHO_URL=https://honcho.example.net make up
101+
102+
# Production — pull the latest published image instead of building:
103+
OPENCONCHO_DEFAULT_HONCHO_URL=https://honcho.example.net make prod
104+
105+
make down # stop + remove (dev or prod)
106+
make clean # down + drop the locally built image
100107
# → http://localhost:8080
101108
```
102109

103-
To drop it into a Honcho Compose stack, use the `openconcho` service in
104-
[`docker-compose.yml`](docker-compose.yml). Full details, env vars, and the CORS
105-
options are in [`docs/docker.md`](docs/docker.md).
110+
Both modes live in one [`docker-compose.yml`](docker-compose.yml) as Compose
111+
profiles: `make up` runs the `dev` profile (`build: .`), `make prod` runs the
112+
`prod` profile (pulls `ghcr…:latest`). `OPENCONCHO_DEFAULT_HONCHO_URL` seeds the first instance
113+
(absolute URL); `OPENCONCHO_UPSTREAM_ALLOWLIST` is an optional SSRF guard
114+
(comma-separated host globs) for when you expose the proxy. Full details and env
115+
vars are in [`docs/docker.md`](docs/docker.md).
116+
117+
### Kubernetes (Helm)
118+
119+
The chart is published as an OCI artifact to GHCR on every tagged release.
120+
121+
```bash
122+
helm install openconcho oci://ghcr.io/offendingcommit/charts/openconcho \
123+
--version 0.14.0 \
124+
--create-namespace --namespace openconcho \
125+
--set honcho.defaultUrl=https://honcho.example.com
126+
```
127+
128+
Enable an Ingress and TLS:
129+
130+
```bash
131+
helm install openconcho oci://ghcr.io/offendingcommit/charts/openconcho \
132+
--version 0.14.0 \
133+
--create-namespace --namespace openconcho \
134+
--set honcho.defaultUrl=https://honcho.example.com \
135+
--set ingress.enabled=true \
136+
--set ingress.className=nginx \
137+
--set 'ingress.hosts[0].host=openconcho.example.com' \
138+
--set 'ingress.hosts[0].paths[0].path=/' \
139+
--set 'ingress.tls[0].secretName=openconcho-tls' \
140+
--set 'ingress.tls[0].hosts[0]=openconcho.example.com'
141+
```
142+
143+
Full chart documentation, configuration reference, and an ArgoCD Application example are in [`charts/openconcho/README.md`](charts/openconcho/README.md).
106144

107145
### Connecting to your instance
108146

charts/openconcho/Chart.yaml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
apiVersion: v2
2+
name: openconcho
3+
description: Self-hosted UI for Honcho — browse memories, peers, sessions, conclusions, and chat with memory context.
4+
type: application
5+
version: 0.14.0
6+
appVersion: "0.14.0"
7+
keywords:
8+
- honcho
9+
- memory
10+
- ai
11+
home: https://github.com/offendingcommit/openconcho
12+
sources:
13+
- https://github.com/offendingcommit/openconcho
14+
maintainers:
15+
- name: offendingcommit
16+
url: https://github.com/offendingcommit

0 commit comments

Comments
 (0)