From 0ab6d499cc1c708f0df71c7c8e44648fada6621c Mon Sep 17 00:00:00 2001 From: yahiaongh Date: Sat, 25 Jul 2026 09:07:03 +0100 Subject: [PATCH] docs: add demo GIF to README; align llm-query on llama3.2:1b with reduced token budget for faster local inference --- README.md | 2 ++ docs/media/demo.gif | Bin 0 -> 3902821 bytes infra/docker-compose.yml | 6 +++--- services/llm-query-python/Dockerfile | 2 +- services/llm-query-python/app/config.py | 6 +++--- 5 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 docs/media/demo.gif diff --git a/README.md b/README.md index 11e7de0..8b8f9cb 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ SentinelOps ingests real-time logs from distributed microservices, detects anomalies using statistical models (z-score + EWMA), and will expose a natural-language incident-query interface (LLM/RAG) for fast triage. Built as a polyglot system (Go, Rust, Python) to demonstrate production patterns across the stack: event-driven ingestion, self-migrating services, batched writes, full observability, and a real CI/CD pipeline with branch protection. +![SentinelOps demo](docs/media/demo.gif) + ## What's actually running today ```mermaid diff --git a/docs/media/demo.gif b/docs/media/demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..250863f69cc869f4cba5843645977b60317683a0 GIT binary patch literal 3902821 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