Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
6190a6f
fix: Docker build and restore dashboard
russellbrenner Jan 13, 2026
a9d0421
feat: add Claude Code hooks and import script for OpenMemory
russellbrenner Jan 13, 2026
bdd04cd
fix: bash compatibility for session-start hook
russellbrenner Jan 13, 2026
57716c6
feat: increase Node.js heap size for production runtime
russellbrenner Jan 14, 2026
5b70729
fix: increase Node.js heap size from 128MB to 512MB
russellbrenner Jan 15, 2026
30635ab
Update dashboard/.env.local.example
russellbrenner Feb 13, 2026
9b0fd43
Update dashboard/app/settings/page.tsx
russellbrenner Feb 13, 2026
8251980
feat: add security scanning CI and make CDN configurable
russellbrenner Feb 13, 2026
7e55684
Initial plan
Copilot Feb 13, 2026
98edaad
Initial plan
Copilot Feb 13, 2026
a0021d5
Add dev dependencies to pyproject.toml for CI
Copilot Feb 13, 2026
a3eb069
feat: merge upstream changes from CaviraOSS/OpenMemory
Copilot Feb 13, 2026
53deb91
fix: correct query_facts_at_time parameter names in mcp.py
Copilot Feb 13, 2026
2607124
Merge pull request #1 from russellbrenner/copilot/fix-ci-issues
russellbrenner Feb 13, 2026
79dec06
Merge pull request #2 from russellbrenner/copilot/merge-upstream-changes
russellbrenner Feb 13, 2026
6a28139
Initial plan
Copilot Feb 13, 2026
b83e775
Security: Fix critical vulnerabilities and add comprehensive improvem…
Copilot Feb 13, 2026
cffeef0
Security: Improve webhook signature verification
Copilot Feb 13, 2026
f67486c
docs: Add security fixes summary and validation results
Copilot Feb 13, 2026
56099a4
Merge pull request #3 from russellbrenner/copilot/review-codebase-for…
russellbrenner Feb 13, 2026
48d3f92
Initial plan
Copilot Feb 13, 2026
eb40eb4
docs: replace improvement plan with repo-grounded execution roadmap
Copilot Feb 13, 2026
cc52b11
docs: refine improvement plan wording after review
Copilot Feb 13, 2026
3922a16
docs: add explicit parallel execution lanes to improvement roadmap
Copilot Feb 13, 2026
977212d
Merge pull request #4 from russellbrenner/copilot/create-improvement-…
russellbrenner Feb 13, 2026
cabb943
Initial plan
Copilot Feb 13, 2026
e7cddb5
Phase 0: Implement security hardening (A1-A4)
Copilot Feb 13, 2026
26fa6ee
Phase 0 complete: Add document features foundation (D0)
Copilot Feb 13, 2026
a7f96d2
Phase 1 (B1): Remove N+1 tag lookups in ranking path
Copilot Feb 13, 2026
050e49c
Phase 1 (B2): Add missing database indexes for query optimization
Copilot Feb 13, 2026
6bbb61b
Phase 1 (B3): Hot-path regex/vector micro-optimizations
Copilot Feb 13, 2026
b3e2caf
Phase 1 (B4): Add Postgres connection pool configuration
Copilot Feb 13, 2026
6d22df5
Address code review feedback: Fix variable naming, logging, and add c…
Copilot Feb 13, 2026
6b01d64
Add implementation summary documentation
Copilot Feb 13, 2026
9d63773
Merge pull request #5 from russellbrenner/copilot/execute-implementat…
russellbrenner Feb 13, 2026
cf30681
Initial plan
Copilot Feb 13, 2026
d267ddd
feat(js): add phase-2 quick-win document metadata enrichment
Copilot Feb 13, 2026
b6a8442
chore(js): refine metadata extraction patterns
Copilot Feb 13, 2026
2174ec3
Initial plan
Copilot Feb 13, 2026
604078a
feat: add GitHub Copilot agents configuration and documentation
Copilot Feb 13, 2026
6910964
Merge pull request #6 from russellbrenner/copilot/scan-repo-for-impro…
russellbrenner Feb 13, 2026
fabd8a7
fix: Phase 0/1 remediation - auth warnings and duplicate indexes
russellbrenner Feb 13, 2026
2fdb206
feat(C3): Add background task observability
russellbrenner Feb 13, 2026
3f41329
feat(D5): Add audit trail system for compliance tracking
russellbrenner Feb 13, 2026
c467b19
Merge pull request #7 from russellbrenner/copilot/setup-repo-for-copi…
russellbrenner Feb 13, 2026
e1afd85
feat(D1): Add document versioning with auto-snapshots
russellbrenner Feb 13, 2026
11e9f56
feat(D4): Add redline/change classification system
russellbrenner Feb 13, 2026
5998da9
feat(D2): Add citation tracking and reference graph
russellbrenner Feb 13, 2026
92ea939
feat(D3): Add structured metadata extraction with zod validation
russellbrenner Feb 13, 2026
f4f488f
feat(D8): Add clause similarity detection
russellbrenner Feb 13, 2026
ddf2f32
feat(D6): Add template management with variable substitution
russellbrenner Feb 13, 2026
bb74c42
feat(C2,D7): Add sector parity check and compliance rules engine
russellbrenner Feb 13, 2026
b435056
docs: Add CLAUDE.md project guidance and D1-D8 code review
russellbrenner Feb 14, 2026
88161f5
fix(D3,D7,D8): Remediate code review findings
russellbrenner Feb 14, 2026
1cd5c86
fix(postgres): Use memories_table variable in all SQL queries
russellbrenner Feb 14, 2026
e403e4d
fix(D1-D8): Additional remediation from code review
russellbrenner Feb 14, 2026
aea0419
docs: Add Redis/Valkey analysis and gitignore auto-generated files
russellbrenner Feb 14, 2026
b898c94
feat(embeddings): Add Voyage AI provider and vector metrics
russellbrenner Feb 16, 2026
07e9fbd
feat(scripts): Add re-embedding utility script
russellbrenner Feb 16, 2026
80f5fb6
feat(metrics): Add Prometheus metrics with embedding cost tracking
russellbrenner Feb 17, 2026
8254693
fix(dashboard): Cast last_seen_at to Number for date display
russellbrenner Feb 17, 2026
aaa3dba
refactor(py): OM-16 Python parity — regex hoisting + timing-safe auth
russellbrenner Feb 23, 2026
0463186
feat(mcp,hsg,db): Phase 1 — deduplicated flag, upsert_key, section in…
russellbrenner Feb 23, 2026
65a4b6e
refactor(hsg,extract,mcp): Phase 2 — code quality fixes
russellbrenner Feb 23, 2026
ef1bf1e
feat(openmemory): Phase 3 — schema, observability, stats tool (OM-9..…
russellbrenner Feb 23, 2026
bdbb1c8
feat(openmemory): Phase 4 — maintenance, error context, decay pinning…
russellbrenner Feb 23, 2026
6f8f750
fix(db,hsg,memory): post-impl verification fixes found by e2e testing
russellbrenner Feb 23, 2026
5537e0b
chore(ci): add Gitea Actions CI for openmemory-api and openmemory-das…
russellbrenner Feb 23, 2026
dd5e3ed
fix(hsg): sanitise raw API content blocks before memory storage
russellbrenner Feb 24, 2026
90416ba
fix(hsg): allow short content through sanitise guard
russellbrenner Feb 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,19 @@ OM_PORT=8080
# Leave empty to disable authentication (development only)
OM_API_KEY=your-secret-api-key-here

# Strict Authentication Mode (Production Safety)
# When enabled, the server will refuse to start if OM_API_KEY is not set
# Set to 'true' in production to prevent accidentally running without authentication
# Default: false (backward compatible - issues warnings but allows unauthenticated access)
OM_REQUIRE_AUTH=false

# CORS Configuration (Cross-Origin Resource Sharing)
# Comma-separated list of allowed origins for CORS requests
# Leave empty to allow all origins with wildcard '*' (development only)
# Example: OM_CORS_ALLOWED_ORIGINS=https://app.example.com,https://dashboard.example.com
# Important: Set this in production to prevent unauthorized cross-origin requests
# OM_CORS_ALLOWED_ORIGINS=

# Rate Limiting
# Enable rate limiting to prevent abuse
OM_RATE_LIMIT_ENABLED=true
Expand Down Expand Up @@ -46,6 +59,17 @@ OM_PG_SCHEMA=public
OM_PG_TABLE=openmemory_memories
OM_PG_SSL=disable # disable | require

# PostgreSQL Connection Pool Settings (Production Tuning)
# Maximum number of clients in the pool (default: 20)
# Recommendation: Set to 2-3x expected concurrent queries
OM_PG_POOL_MAX=20
# Minimum number of clients to keep in the pool (default: 0)
OM_PG_POOL_MIN=0
# Time in milliseconds a client can be idle before being removed (default: 30000 = 30 seconds)
OM_PG_POOL_IDLE_TIMEOUT=30000
# Time in milliseconds to wait for a connection from the pool (default: 10000 = 10 seconds)
OM_PG_POOL_CONNECTION_TIMEOUT=10000

# --------------------------------------------
# Vector Store Backend
# --------------------------------------------
Expand Down Expand Up @@ -103,6 +127,12 @@ OM_EMBED_DELAY_MS=200
# Max request body size in bytes (default: 1MB)
OM_MAX_PAYLOAD_SIZE=1000000

# Webhook Security
# GitHub Webhook Secret (for validating webhook signatures)
# Generate with: openssl rand -hex 20
# Configure this same secret in your GitHub webhook settings
GITHUB_WEBHOOK_SECRET=your-github-webhook-secret-here

# --------------------------------------------
# Embedding Provider API Keys
# --------------------------------------------
Expand Down Expand Up @@ -239,3 +269,9 @@ OM_COMPRESSION_ALGORITHM=auto
OM_LG_NAMESPACE=default
OM_LG_MAX_CONTEXT=50
OM_LG_REFLECTIVE=true

# --------------------------------------------
# Dashboard Settings
# --------------------------------------------
# CDN hostname for images (optional)
# NEXT_PUBLIC_CDN_HOSTNAME=cdn.example.com
156 changes: 156 additions & 0 deletions .gitea/workflows/build.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
name: Build OpenMemory images

on:
workflow_dispatch:
push:
branches:
- main
paths:
- packages/openmemory-js/**
- dashboard/**
- .gitea/workflows/build.yaml

jobs:
build-api:
runs-on: self-hosted
steps:
- name: Setup
run: |
buildah --version
SHORT_SHA=$(echo "${{ github.sha }}" | cut -c1-7)
echo "SHORT_SHA=${SHORT_SHA}" >> "$GITHUB_ENV"

- name: Checkout
env:
DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
run: |
REPO_URL="${{ github.server_url }}/${{ github.repository }}.git"
AUTH_URL=$(echo "$REPO_URL" | sed "s|https://|https://token:${DEPLOY_TOKEN}@|")
rm -rf checkout && git clone --depth=1 "$AUTH_URL" checkout

- name: Login to registry
env:
REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }}
run: |
buildah login -u rbrenner -p "${REGISTRY_TOKEN}" git.itsa.house

- name: Build API image
run: |
cd checkout/packages/openmemory-js
buildah bud --isolation=chroot \
-t git.itsa.house/homelab/openmemory-api:latest \
-t git.itsa.house/homelab/openmemory-api:${SHORT_SHA} \
-f Dockerfile .

- name: Push API image
run: |
push_retry() {
local img=$1 attempt=0
while [ $attempt -lt 3 ]; do
attempt=$((attempt + 1))
echo "Push attempt $attempt/3: $img"
if buildah push "$img"; then return 0; fi
echo "Attempt $attempt failed, retrying in 15s..."
sleep 15
done
echo "Push failed after 3 attempts: $img"
return 1
}
push_retry git.itsa.house/homelab/openmemory-api:latest
push_retry git.itsa.house/homelab/openmemory-api:${SHORT_SHA}

- name: Validate API image
run: |
buildah pull git.itsa.house/homelab/openmemory-api:${SHORT_SHA}
buildah inspect git.itsa.house/homelab/openmemory-api:${SHORT_SHA} | jq -r '.OCIv1.config.Entrypoint'
echo "VALIDATED: openmemory-api:${SHORT_SHA}"

- name: Notify success
if: success()
env:
WEBHOOK_URL: ${{ secrets.MATTERMOST_AGENT_WEBHOOK }}
run: |
curl -sf -X POST "$WEBHOOK_URL" \
-H 'Content-Type: application/json' \
-d "{\"text\": \"**[ci]** Built openmemory-api :${SHORT_SHA} (buildah)\", \"username\": \"Gitea CI\"}" || true

- name: Notify failure
if: failure()
env:
WEBHOOK_URL: ${{ secrets.MATTERMOST_ALERTS_WEBHOOK }}
run: |
curl -sf -X POST "$WEBHOOK_URL" \
-H 'Content-Type: application/json' \
-d "{\"text\": \"**[ci] FAILED** :rotating_light: openmemory-api build\nRun: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}\", \"username\": \"Gitea CI\"}" || true

build-dashboard:
runs-on: self-hosted
steps:
- name: Setup
run: |
buildah --version
SHORT_SHA=$(echo "${{ github.sha }}" | cut -c1-7)
echo "SHORT_SHA=${SHORT_SHA}" >> "$GITHUB_ENV"

- name: Checkout
env:
DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
run: |
REPO_URL="${{ github.server_url }}/${{ github.repository }}.git"
AUTH_URL=$(echo "$REPO_URL" | sed "s|https://|https://token:${DEPLOY_TOKEN}@|")
rm -rf checkout && git clone --depth=1 "$AUTH_URL" checkout

- name: Login to registry
env:
REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }}
run: |
buildah login -u rbrenner -p "${REGISTRY_TOKEN}" git.itsa.house

- name: Build dashboard image
run: |
cd checkout/dashboard
buildah bud --isolation=chroot \
-t git.itsa.house/homelab/openmemory-dashboard:latest \
-t git.itsa.house/homelab/openmemory-dashboard:${SHORT_SHA} \
-f Dockerfile .

- name: Push dashboard image
run: |
push_retry() {
local img=$1 attempt=0
while [ $attempt -lt 3 ]; do
attempt=$((attempt + 1))
echo "Push attempt $attempt/3: $img"
if buildah push "$img"; then return 0; fi
echo "Attempt $attempt failed, retrying in 15s..."
sleep 15
done
echo "Push failed after 3 attempts: $img"
return 1
}
push_retry git.itsa.house/homelab/openmemory-dashboard:latest
push_retry git.itsa.house/homelab/openmemory-dashboard:${SHORT_SHA}

- name: Validate dashboard image
run: |
buildah pull git.itsa.house/homelab/openmemory-dashboard:${SHORT_SHA}
buildah inspect git.itsa.house/homelab/openmemory-dashboard:${SHORT_SHA} | jq -r '.OCIv1.config.Cmd'
echo "VALIDATED: openmemory-dashboard:${SHORT_SHA}"

- name: Notify success
if: success()
env:
WEBHOOK_URL: ${{ secrets.MATTERMOST_AGENT_WEBHOOK }}
run: |
curl -sf -X POST "$WEBHOOK_URL" \
-H 'Content-Type: application/json' \
-d "{\"text\": \"**[ci]** Built openmemory-dashboard :${SHORT_SHA} (buildah)\", \"username\": \"Gitea CI\"}" || true

- name: Notify failure
if: failure()
env:
WEBHOOK_URL: ${{ secrets.MATTERMOST_ALERTS_WEBHOOK }}
run: |
curl -sf -X POST "$WEBHOOK_URL" \
-H 'Content-Type: application/json' \
-d "{\"text\": \"**[ci] FAILED** :rotating_light: openmemory-dashboard build\nRun: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}\", \"username\": \"Gitea CI\"}" || true
Loading