Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
55ba1ba
test: move mock streaming STT off port 9999 to 8879
AnkushMalaker Aug 5, 2026
c4a0fc2
fix(immich): restore UTC on Mongo timestamps before the asset search
AnkushMalaker Aug 5, 2026
c4fc0c3
fix(timeline): treat Immich as a polled source, not a heartbeat agent
AnkushMalaker Aug 5, 2026
4a0d5af
feat(memory): deterministic person identity and merge service
AnkushMalaker Aug 5, 2026
b5dc474
feat(obsidian): Chronicle Companion plugin for semantic vault actions
AnkushMalaker Aug 5, 2026
f2f7f57
build: drop the unused deepgram extra
AnkushMalaker Aug 5, 2026
03416fe
feat(compose): canonical compose-stack doc, MagicDNS-first DNS pin, d…
AnkushMalaker Aug 5, 2026
fbaa56e
fix(setup): install chronicle-setup editable so source edits take effect
AnkushMalaker Aug 5, 2026
d9c25d6
feat(memory): codex quota yielding and token-usage telemetry
AnkushMalaker Aug 5, 2026
79cb894
fix(transcription): decide stream resume causally, not by entry age a…
AnkushMalaker Aug 5, 2026
4f85776
feat(observability): report the node agent itself going unreachable
AnkushMalaker Aug 5, 2026
81c7b26
refactor(curation): use the shared vault_media.promote_image_bytes
AnkushMalaker Aug 5, 2026
370051e
feat(conversations): search by conversation ID, sturdier ID copy
AnkushMalaker Aug 5, 2026
4aa920b
refactor(webui): rebuild Queue page on the shared UI primitives
AnkushMalaker Aug 5, 2026
8b3b978
feat(tray): recorder update/revert from the chronicle-latest prerelease
AnkushMalaker Aug 5, 2026
1a699d1
docs: sync AGENTS.md and memories.md with shipped features
AnkushMalaker Aug 5, 2026
8ab2832
fix(plugins): let HA_URL override the Home Assistant URL in the template
AnkushMalaker Aug 5, 2026
3e9603e
Merge rainbow dev: person merge service, Obsidian companion, Immich f…
AnkushMalaker Aug 5, 2026
9c8ef71
feat(data-audit): verify and curate annotation exports before they ship
AnkushMalaker Aug 5, 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
9 changes: 8 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ Chronicle includes an **interactive setup wizard** for easy configuration. The w
- Memory configuration (agentic Markdown vault — Chronicle's single memory provider)
- Network configuration and HTTPS setup
- Optional services (speaker recognition, Parakeet ASR)
- Immich photo library integration (photo discovery + person photos in the vault)

### Quick Start
```bash
Expand Down Expand Up @@ -128,7 +129,11 @@ All test operations are managed through a simple Makefile interface:
cd tests

# Full test workflow (recommended)
make test # Start containers + run all tests
make test # Start containers + run all tests (profile: mock, no credentials)

# Same suite against real backing services (see tests/profiles.yml)
make test PROFILE=deepgram-openai # real Deepgram STT + real OpenAI LLM
make test PROFILE=deepgram-openai-speaker # ...plus the real speaker service

# Or step by step
make start # Start test containers (with health checks)
Expand Down Expand Up @@ -588,6 +593,7 @@ tailscale ip -4

### Testing Strategy
- **Makefile-Based**: All test operations through simple `make` commands (`make test`, `make start`, `make stop`)
- **One suite, N service profiles**: tests are never selected by whether an API key is present. `tests/profiles.yml` declares which backing services are real for a run; stubs replay recorded real responses from `tests/cassettes/`, so the same assertions hold with or without credentials. Do not add a tag or a skip to work around a missing key — record a cassette (`make record-cassettes`) or fix the stub.
- **Log Preservation**: Container logs always saved before cleanup (never lose debugging info)
- **End-to-End Integration**: Robot Framework validates complete audio processing pipeline
- **Environment Flexibility**: Tests work with both local .env files and CI environment variables
Expand Down Expand Up @@ -634,6 +640,7 @@ For detailed technical documentation, see:
- **[@docs/podman.md](docs/podman.md)**: Running with Podman instead of Docker (engine selection, rootless/GPU setup)
- **[@docs/screenpipe.md](docs/screenpipe.md)**: ScreenPipe capture-node architecture, services, desktop controls, and troubleshooting
- **[@docs/audio-pipeline-architecture.md](docs/audio-pipeline-architecture.md)**: Audio pipeline design
- **[@docs/backend/compose-stack.md](docs/backend/compose-stack.md)**: Backend compose services, shared mounts, and profiles
- **[@docs/backend/auth.md](docs/backend/auth.md)**: Authentication architecture
- **[@docs/backend/memories.md](docs/backend/memories.md)**: Memory system documentation
- **[@docs/backend/plugin-development-guide.md](docs/backend/plugin-development-guide.md)**: Plugin development guide
Expand Down
4 changes: 2 additions & 2 deletions backends/advanced/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ COPY pyproject.toml uv.lock ./

# Build a project .venv from the lockfile (includes git deps like Graphiti)
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --frozen --no-dev --extra deepgram --extra galileo --extra benchmark --no-install-project
uv sync --frozen --no-dev --extra galileo --extra benchmark --no-install-project


# ============================================
Expand Down Expand Up @@ -138,7 +138,7 @@ WORKDIR /app
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
COPY pyproject.toml uv.lock ./
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --frozen --extra deepgram --extra galileo --extra benchmark --group test --no-install-project && \
uv sync --frozen --extra galileo --extra benchmark --group test --no-install-project && \
rm /bin/uv /bin/uvx

ENV VIRTUAL_ENV=/app/.venv
Expand Down
6 changes: 3 additions & 3 deletions backends/advanced/Dockerfile.k8s
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@ COPY uv.lock .
RUN mkdir -p src/advanced_omi_backend
COPY src/advanced_omi_backend/__init__.py src/advanced_omi_backend/

# Install dependencies using uv with deepgram extra
# Install dependencies using uv
# Use cache mount for BuildKit, fallback for legacy builds
# RUN --mount=type=cache,target=/root/.cache/uv \
# uv sync --extra deepgram
# uv sync
# Fallback for legacy Docker builds (CI compatibility)
RUN uv sync --extra deepgram
RUN uv sync

# Copy all application code
COPY . .
Expand Down
30 changes: 30 additions & 0 deletions backends/advanced/Docs/data-audit.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,36 @@ records by `clip_id` + `conversation_id` + source times. Helpers live in
the Data Audit toolbar (exports selected rows; modal also lists/downloads/
deletes server-side exports).

### Contents preview (verify before shipping)

`POST /export/preview` (same body minus `sensitivity_policy`) is a synchronous
dry-run: it returns the exact clips the settings would produce — boundaries,
durations, and the sliced transcript each manifest record would carry —
without writing any audio. Preview and job share one code path
(`utils/export_planning.plan_conversation_clips`), so the preview cannot drift
from the export. Unanalyzed conversations are reported skipped
(`not analyzed`) rather than analyzed inline; the export job still runs VAD
for them.

The modal's **Dataset contents** panel renders this plan live (auto-refreshing
as params or screen withholdings change): per-clip play (gapless player over
the clip's range), the transcript slice (a `no transcript` badge marks clips
an annotator would receive silent), and an include checkbox per clip. Unticked
clips are passed to `/export` as `dropped_ranges`
(`{conversation_id: [[start, end], …]}`) and carved out exactly like privacy
ranges but accounted separately (`params.curated`, per-conversation and total
`dropped_seconds`): one bucket means "too sensitive to share", the other "not
worth annotating".

### Export history

The listing joins the on-disk `export.json` metadata to mark conversations a
previous export actually shipped (skipped ones don't count): each row carries
`last_export` (chipped `exported` in the table), and the `exported=never|exported`
filter scopes a curation session to un-shipped audio. Reading history from the
export directories means deleting an export naturally un-marks its
conversations — no second source of truth.

## Privacy screen (shareability gate)

Before sharing audio + transcripts with an outside annotator, the export can
Expand Down
6 changes: 4 additions & 2 deletions backends/advanced/docker-compose-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -166,10 +166,12 @@ services:
build:
context: ../..
dockerfile: tests/Dockerfile.mock-streaming-stt
# 8879 on purpose: the old 9999 is a popular default port for other
# tools and collided with unrelated services on a dev host.
ports:
- "9999:9999"
- "8879:8879"
healthcheck:
test: ["CMD", "python", "-c", "import socket; s=socket.socket(); s.connect(('localhost',9999)); s.close()"]
test: ["CMD", "python", "-c", "import socket; s=socket.socket(); s.connect(('localhost',8879)); s.close()"]
interval: 10s
timeout: 5s
retries: 3
Expand Down
Loading
Loading