{"id":48592783,"url":"https://github.com/jcktp/operator","last_synced_at":"2026-05-03T23:02:14.642Z","repository":{"id":349837088,"uuid":"1187998445","full_name":"jcktp/operator","owner":"jcktp","description":"Local-first AI workspace for document analysis, investigations, and team intelligence. Runs entirely on your machine.","archived":false,"fork":false,"pushed_at":"2026-05-03T06:27:08.000Z","size":2422,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-03T08:26:59.902Z","etag":null,"topics":["ai","document-analysis","llm","local","privacy","sqlite","typescript"],"latest_commit_sha":null,"homepage":"https://jcktp.github.io/operator/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jcktp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"license.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-21T13:34:14.000Z","updated_at":"2026-05-03T06:27:11.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jcktp/operator","commit_stats":null,"previous_names":["jcktp/operator"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/jcktp/operator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcktp%2Foperator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcktp%2Foperator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcktp%2Foperator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcktp%2Foperator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jcktp","download_url":"https://codeload.github.com/jcktp/operator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcktp%2Foperator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32587823,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T22:12:39.696Z","status":"ssl_error","status_checked_at":"2026-05-03T22:09:10.534Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","document-analysis","llm","local","privacy","sqlite","typescript"],"created_at":"2026-04-08T20:52:18.130Z","updated_at":"2026-05-03T23:02:14.630Z","avatar_url":"https://github.com/jcktp.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# Operator\n\n**Local-first AI workspace for investigative journalism**\n\nUpload notes, sources, photos, and documents. Get structured AI analysis — entities, timelines, claims, redactions. Everything runs on your machine.\n\n\u003cbr\u003e\n\n![Local-first](https://img.shields.io/badge/runs%20locally-no%20cloud%20required-18181b?style=flat-square\u0026labelColor=18181b\u0026color=22c55e)\n![License](https://img.shields.io/badge/license-BSL%201.1-18181b?style=flat-square\u0026labelColor=18181b\u0026color=6366f1)\n![Next.js](https://img.shields.io/badge/Next.js%2016-Turbopack-18181b?style=flat-square\u0026labelColor=18181b\u0026color=3f3f46)\n![SQLite](https://img.shields.io/badge/database-SQLite-18181b?style=flat-square\u0026labelColor=18181b\u0026color=3f3f46)\n\n\u003cbr\u003e\n\n![AI providers](https://img.shields.io/badge/AI-Ollama-18181b?style=flat-square\u0026labelColor=18181b\u0026color=a1a1aa)\n![AI providers](https://img.shields.io/badge/AI-Claude-18181b?style=flat-square\u0026labelColor=18181b\u0026color=a1a1aa)\n![AI providers](https://img.shields.io/badge/AI-GPT-18181b?style=flat-square\u0026labelColor=18181b\u0026color=a1a1aa)\n![AI providers](https://img.shields.io/badge/AI-Gemini-18181b?style=flat-square\u0026labelColor=18181b\u0026color=a1a1aa)\n![AI providers](https://img.shields.io/badge/AI-Groq-18181b?style=flat-square\u0026labelColor=18181b\u0026color=a1a1aa)\n![AI providers](https://img.shields.io/badge/AI-Mistral-18181b?style=flat-square\u0026labelColor=18181b\u0026color=a1a1aa)\n![AI providers](https://img.shields.io/badge/AI-xAI-18181b?style=flat-square\u0026labelColor=18181b\u0026color=a1a1aa)\n![AI providers](https://img.shields.io/badge/AI-Perplexity-18181b?style=flat-square\u0026labelColor=18181b\u0026color=a1a1aa)\n\n\u003c/div\u003e\n\n---\n\n## What it does\n\nOperator is a private journalism workspace. Upload documents, images, and audio to get structured AI analysis — summaries, claims, entity extraction, timelines, and comparisons — with framing tuned for investigative reporting. Everything runs locally; no data leaves your machine unless you choose a cloud AI provider.\n\n### Core\n\n- **Stories** — organise work into scoped stories with documents, entities, timelines, and dispatch\n- **Document analysis** — AI extracts summaries, claims, flags, and follow-up questions framed for journalism\n- **Image \u0026 audio uploads** — photos get OCR + EXIF extraction; audio files are transcribed with speaker diarization\n- **Library** — full document history with keyword and semantic search, auto-tagging, duplicate detection, and annotations\n- **Dashboard** — cross-beat overview with health signals, document digest, and one-pager export\n- **Dispatch** — AI chat with document context, memory, web search, and journalism-tuned personas\n- **Pulse** — feed aggregator (RSS, Reddit, YouTube, Bluesky, Mastodon) with keyword monitoring\n- **Journal** — private notes with folder organisation and AI grammar correction\n- **Remote submissions** — shareable link for sources to submit files directly to your library\n- **P2P collaboration** — LAN-based sync with threaded chat and conflict resolution\n\n### Analysis tools\n\n- **Entities** — extraction, timeline, interactive story map, and AI-assisted storyline builder\n- **Entity Network** — force-directed graph of extracted entities with cluster highlighting\n- **Claims Tracker** — log and verify factual claims from sources\n- **Risk Register** — probability x impact scoring, owner assignment, auto-creation from uploads\n- **Actions** — task tracking with assignee, due date, priority, and auto-extraction from documents\n\n### Investigation tools\n\n- **Image Analysis** — face extraction/comparison, Error Level Analysis, deepfake detection, reverse search\n- **Photo Map** — geotagged photos on an interactive map with EXIF details\n- **Speaker Diarization** — speaker-segmented transcripts with talk-time stats and speaker library\n- **Web Monitor** — track web pages for changes with configurable intervals, CSS selector targeting, diff view, and AI change summaries\n- **Research Tools** — Wayback Machine lookups, document diff, structured research workflows\n- **FOIA Tracker** — public records requests with 7 status stages and overdue alerts\n- **File Cleaner** — strip EXIF metadata before sharing\n\n---\n\n## Requirements\n\n- **macOS or Linux** (Windows via WSL) — **Node.js 18+** — **Ollama** — **~5 GB disk** — **8 GB RAM** (16 GB recommended)\n- All dependencies auto-installed by `start.sh`\n- Cloud AI (Anthropic, OpenAI, Google, Groq, xAI, Perplexity, Mistral) optional — configure in Settings\n\n---\n\n## Installation\n\n```bash\n# Clone\ngit clone https://github.com/jcktp/operator.git \u0026\u0026 cd operator\n\n# Run (installs everything on first run, starts in seconds after)\nbash start.sh\n```\n\nOr download the ZIP from [Releases](https://github.com/jcktp/operator/releases), extract, and run `bash start.sh`.\n\n---\n\n## AI providers\n\n**Local (default):** Ollama runs on-device. Default models: `phi4-mini` (text, ~2.5 GB) and `llava-phi3` (vision, ~2.9 GB). Optional audio models: `gemma4:e2b` or `phi4-multimodal`. Three setup modes available: Text + Vision, Full split, or All-in-one.\n\n**Cloud:** Enter API keys in Settings. Keys are AES-256-GCM encrypted and never leave your machine except in direct API calls.\n\nSupported: Anthropic, OpenAI, Google Gemini, Groq, xAI, Perplexity, Mistral.\n\n---\n\n## Security\n\n- AES-256-GCM encrypted API keys; SHA-256 session hashing; HTTP-only cookies\n- All 60+ API routes require authentication; shell commands use `execFile` with argument arrays\n- File paths validated against root before serving; binds to localhost only\n- No telemetry, no tracking, no external calls except to configured AI providers\n\n---\n\n## Tech stack\n\nNext.js 16 (Turbopack) · SQLite + Prisma 7 · Ollama · Tailwind CSS v4 · OpenLayers · Cloudflare Quick Tunnel\n\n---\n\n## Development\n\n```bash\nnpm test              # all tests (unit + integration)\nnpm run test:watch    # watch mode\nnpm run test:coverage # coverage report\n```\n\nAPI reference: [`docs/api.md`](./docs/api.md)\n\n---\n\n## License\n\n**BSL 1.1** — non-commercial use is free. Commercial use requires a license. Converts to MIT on January 1, 2032. Full text: [`license.md`](./license.md)\n\nAI outputs are probabilistic — verify all analysis before acting on it.\n\n---\n\n\u003cdiv align=\"center\"\u003e\nBuilt by Jorick.\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjcktp%2Foperator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjcktp%2Foperator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjcktp%2Foperator/lists"}