{"id":49973302,"url":"https://github.com/cerul-ai/cerul-app","last_synced_at":"2026-06-28T00:00:55.095Z","repository":{"id":363038570,"uuid":"1261696034","full_name":"cerul-ai/cerul-app","owner":"cerul-ai","description":"Cerul App — self-hosted video search. Open source. By Cerul.","archived":false,"fork":false,"pushed_at":"2026-06-22T11:11:18.000Z","size":34641,"stargazers_count":8,"open_issues_count":1,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-22T11:23:37.844Z","etag":null,"topics":["ai-search","desktop-app","electron","local-first","multimodal","qdrant","rust","self-hosted","semantic-search","video-search"],"latest_commit_sha":null,"homepage":null,"language":"Rust","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/cerul-ai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-07T03:15:20.000Z","updated_at":"2026-06-22T07:33:28.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/cerul-ai/cerul-app","commit_stats":null,"previous_names":["cerul-ai/cerul-app"],"tags_count":40,"template":false,"template_full_name":null,"purl":"pkg:github/cerul-ai/cerul-app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cerul-ai%2Fcerul-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cerul-ai%2Fcerul-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cerul-ai%2Fcerul-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cerul-ai%2Fcerul-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cerul-ai","download_url":"https://codeload.github.com/cerul-ai/cerul-app/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cerul-ai%2Fcerul-app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34872279,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-27T02:00:06.362Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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-search","desktop-app","electron","local-first","multimodal","qdrant","rust","self-hosted","semantic-search","video-search"],"created_at":"2026-05-18T09:40:23.027Z","updated_at":"2026-06-28T00:00:55.077Z","avatar_url":"https://github.com/cerul-ai.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cbr /\u003e\n  \u003ca href=\"https://cerul.ai\"\u003e\n    \u003cpicture\u003e\n      \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"apps/desktop/public/brand/icon-silver/cerul-icon-silver-256.png\" /\u003e\n      \u003cimg src=\"apps/desktop/public/brand/icon-graphite/cerul-icon-graphite-256.png\" alt=\"Cerul\" width=\"96\" /\u003e\n    \u003c/picture\u003e\n  \u003c/a\u003e\n  \u003ch1\u003eCerul App\u003c/h1\u003e\n  \u003cp\u003e\u003cstrong\u003eA self-hosted second brain for everything you watch and hear.\u003c/strong\u003e\u003c/p\u003e\n  \u003cp\u003ePoint it at your folders, YouTube channels, and podcast feeds. Cerul watches them locally, transcribes with provider keys you control or local models, and indexes the results on your machine — then lets you search by meaning across speech and on-screen content, and jump straight to the moment, from a desktop app, a global overlay, or the Cerul Core API.\u003c/p\u003e\n\n  \u003cp\u003e\n    \u003ca href=\"https://app.cerul.ai\"\u003e\u003cstrong\u003eGet the app\u003c/strong\u003e\u003c/a\u003e \u0026middot;\n    \u003ca href=\"https://cerul.ai\"\u003e\u003cstrong\u003eWebsite\u003c/strong\u003e\u003c/a\u003e \u0026middot;\n    \u003ca href=\"https://github.com/cerul-ai/cerul\"\u003e\u003cstrong\u003eMain Repo\u003c/strong\u003e\u003c/a\u003e \u0026middot;\n    \u003ca href=\"https://x.com/cerul_hq\"\u003e\u003cimg src=\"https://img.shields.io/badge/follow-%40cerul__hq-000?style=flat-square\u0026logo=x\" alt=\"Follow on X\" /\u003e\u003c/a\u003e \u0026middot;\n    \u003ca href=\"https://discord.gg/qHDEMQB9vN\"\u003e\u003cimg src=\"https://img.shields.io/badge/join-Discord-5865F2?style=flat-square\u0026logo=discord\u0026logoColor=white\" alt=\"Join Discord\" /\u003e\u003c/a\u003e \u0026middot;\n    \u003ca href=\"#community\"\u003e\u003cimg src=\"https://img.shields.io/badge/join-WeChat-07C160?style=flat-square\u0026logo=wechat\u0026logoColor=white\" alt=\"Join WeChat group\" /\u003e\u003c/a\u003e\n  \u003c/p\u003e\n\n  \u003cp\u003e\n    \u003ca href=\"./LICENSE\"\u003e\u003cimg alt=\"License\" src=\"https://img.shields.io/badge/license-FSL--1.1--ALv2-3b82f6?style=flat-square\" /\u003e\u003c/a\u003e\n    \u003cimg alt=\"Platforms\" src=\"https://img.shields.io/badge/platforms-macOS%20%7C%20Linux%20%7C%20Windows-22c55e?style=flat-square\" /\u003e\n    \u003cimg alt=\"Status\" src=\"https://img.shields.io/badge/status-v0.0.32-22c55e?style=flat-square\" /\u003e\n  \u003c/p\u003e\n\n  \u003cp\u003e\n    \u003cstrong\u003eEnglish\u003c/strong\u003e \u0026middot;\n    \u003ca href=\"README.zh-CN.md\"\u003e简体中文\u003c/a\u003e\n  \u003c/p\u003e\n\n  \u003ca href=\"https://app.cerul.ai\"\u003e\u003cimg src=\"apps/desktop/public/brand/screenshots/app-cerul-home.png\" alt=\"Cerul App — search what you watch and hear, locally\" width=\"840\" /\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cbr /\u003e\n\n\u003e [!NOTE]\n\u003e **Initial release.** Cerul App is the source-available, self-hostable companion to [Cerul Cloud](https://cerul.ai). Current version: **0.0.32**. The core is functional — desktop shell, Cerul Core, indexing pipeline, hybrid search, overlay, and tray all run today. Public release builds are published through GitHub Releases; macOS artifacts are signed and notarized when the release workflow has Developer ID credentials.\n\n## Why Cerul App\n\nMost of what you learn lives in video and audio — talks, podcasts, lectures, recorded calls — and it's the hardest content to search. Transcripts capture what was *said*; the rest is locked inside files you'll never scrub through again.\n\nCerul App turns your own media into a searchable, **local-first** memory:\n\n- **Your machine, your data.** Media, transcripts, and the vector index all stay on disk. Inference runs through provider keys *you* control, or fully local models — no Cerul account required.\n- **Search by meaning.** Hybrid retrieval combines full-text (SQLite/FTS) with an embedded local vector index so you find the moment, not just the keyword.\n- **Always on, out of the way.** A global hotkey overlay, menu-bar tray, background indexing, and start-at-login keep it one keystroke away.\n- **Agent-ready.** Cerul Core exposes a local Agent API on `http://127.0.0.1:23785/v1` so coding agents and scripts can query your library.\n\n## How it works\n\nThe indexing pipeline is built for reliability — text search stays available even if embedding fails:\n\n1. **Fetch** media from local folders, YouTube (`yt-dlp`), or podcast RSS.\n2. **Extract** audio and sample frames with `ffmpeg`.\n3. **Transcribe** via a Remote API provider or the local Qwen3-VL / MLX runtime.\n4. **Index text** into SQLite/FTS immediately — searchable right away.\n5. **Embed** transcript chunks and write vectors to the embedded zvec index when embedding succeeds.\n\n\u003e Visual understanding (slides, charts, on-screen text via Gemini) is an opt-in beta enrichment on an item's detail page, not a required step in the pipeline.\n\n## Sources \u0026 surfaces\n\n| Sources | Surfaces | Inference |\n|---|---|---|\n| Local folders | Desktop window (library, sources, settings, detail) | **Remote API** — your provider keys (default) |\n| YouTube channels \u0026 videos | Global search overlay (hotkey) | **Local model** — Qwen3-VL / MLX (macOS arm64) |\n| Podcast RSS feeds | Local Agent API (`http://127.0.0.1:23785/v1`) | |\n\n## Quickstart\n\n\u003e Requires Rust (stable), Node 22 + pnpm 9, and native build tools (`ffmpeg`, `protobuf`, `cmake`).\n\n```bash\ngit clone https://github.com/cerul-ai/cerul-app.git\ncd cerul-app\npnpm install\n\n./run.sh\n```\n\nFor a clean rebuild that clears build caches first:\n\n```bash\n./rebuild.sh\n```\n\n## Configuration\n\nConfigure provider connections in the app's **Settings → Models** screen. OpenAI-compatible endpoints work too: enter the API base URL, for example `https://api.lazu.ai/v1`, then use model discovery or type the model ID directly.\n\nFor source development, `run.sh` can also load a local `.env` file with default provider values. This is only a developer convenience:\n\n```bash\n# Transcription (ASR)\nCERUL_ASR_MODEL=whisper-1\nCERUL_ASR_API_KEY=...\nCERUL_ASR_BASE_URL=https://api.openai.com/v1\n\n# Embeddings\nCERUL_EMBEDDING_MODEL=...\nCERUL_EMBEDDING_API_KEY=...\nCERUL_EMBEDDING_BASE_URL=...\n```\n\nYou can also switch to a fully local model (Qwen3-VL / MLX) in the app's Models settings.\n\n## Cerul Core API\n\nOnce the app is running, query your library over HTTP — handy for agents and automation:\n\n```bash\n# Status and API discovery\ncurl http://127.0.0.1:23785/v1/status\ncurl http://127.0.0.1:23785/v1/openapi.json\n\n# Search by meaning\ncurl -X POST http://127.0.0.1:23785/v1/search \\\n  -H 'content-type: application/json' \\\n  -d '{\"query\": \"what did they say about scaling laws\", \"max_results\": 5}'\n```\n\nThe stable agent surface includes `/v1/search`, `/v1/ask`, `/v1/items`, `/v1/items/:id/chunks`, and playable evidence routes under `/v1/chunks/:id/*`. Desktop product internals live under `/internal` and are not the public agent contract.\n\n## Project layout\n\n```text\napps/\n  desktop/         Frontend UI (library, sources, settings, overlay)\n  electron-shell/  Electron runtime, tray, hotkeys, media streaming\ncrates/            Rust core — API, storage, indexing, search, sources\nmlx-sidecar/       Local model runtime (Qwen3-VL / MLX, macOS arm64)\nscripts/           Build, packaging, and smoke-test scripts\n```\n\n## Status \u0026 roadmap\n\nCerul App is in alpha. Current release: **0.0.32**. The foundation works end to end, and the release workflow now gates public macOS artifacts on signing, notarization, and installed-build smoke coverage.\n\n**Working today**\n- Electron desktop shell, local REST API, storage, and indexing pipeline\n- Hybrid (FTS + vector) search, search overlay, tray, notifications, start-at-login\n- Folder, YouTube, and RSS sources; Remote API and local-model inference\n\n**Next release hardening**\n- Windows/Linux packaging and signing\n- Update metadata and auto-update rollout checks\n- Broader installed-build release smoke coverage\n- Third-party binary license review (`ffmpeg`, `yt-dlp`)\n\nWant newer ready-to-install builds? Star and watch the repo — public builds ship as GitHub Releases.\n\n## Community\n\nQuestions, feedback, or just want to follow along? Join the conversation — pick whichever community is closest to you.\n\n**🇨🇳 中国 (China)** — scan to join the WeChat group or the QQ group:\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\" valign=\"top\" width=\"50%\"\u003e\n\n**微信群 (WeChat)**\n\n「Cerul.ai 官方社群」\n\n\u003cimg src=\".github/assets/wechat-group-qr.png\" alt=\"Cerul.ai 官方微信社群二维码\" width=\"220\" /\u003e\n\n\u003c/td\u003e\n\u003ctd align=\"center\" valign=\"top\" width=\"50%\"\u003e\n\n**QQ 群 (QQ group)**\n\n群号 `715466401`\n\n\u003cimg src=\".github/assets/qq-group-qr.png\" alt=\"Cerul.ai QQ 群二维码\" width=\"220\" /\u003e\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n**🌍 International** — chat with users and contributors worldwide on Discord:\n\n\u003ca href=\"https://discord.gg/qHDEMQB9vN\"\u003e\u003cimg src=\"https://img.shields.io/badge/Join%20our-Discord-5865F2?style=for-the-badge\u0026logo=discord\u0026logoColor=white\" alt=\"Join our Discord\" /\u003e\u003c/a\u003e\n\n\u003e **Heads up:** the QR codes rotate periodically and may expire. The QQ group number (`715466401`) always works — just search it in QQ. If a WeChat scan fails, ping us on [Discord](https://discord.gg/qHDEMQB9vN) or [X / Twitter](https://x.com/cerul_hq) for the latest invite.\n\n## How this fits with Cerul\n\nCerul App is the **source-available, self-hosted** layer of the [Cerul](https://github.com/cerul-ai/cerul) platform — run it on your own machine with your own keys. [Cerul Cloud](https://cerul.ai) is the hosted service for teams that want managed indexing, the video search API, and account-backed sync. The app works fully standalone; the Cloud account is optional. The Cerul Cloud account backend is not included in this repository; the desktop client only calls its public account API when you sign in.\n\n## Project governance\n\n- [`SECURITY.md`](SECURITY.md), [`PRIVACY.md`](PRIVACY.md), [`CONTRIBUTING.md`](CONTRIBUTING.md), [`THIRD_PARTY_LICENSES.md`](THIRD_PARTY_LICENSES.md), and [`TRADEMARKS.md`](TRADEMARKS.md).\n\n## Contributing\n\nIssues and pull requests are welcome. For development, verify your change before opening a PR:\n\n```bash\ncargo check --workspace\npnpm --filter @cerul/desktop build\nscripts/smoke.sh\n```\n\n## License\n\n[FSL-1.1-ALv2](LICENSE) © Cerul. Source-available; each release converts to Apache-2.0 two years after it ships.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcerul-ai%2Fcerul-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcerul-ai%2Fcerul-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcerul-ai%2Fcerul-app/lists"}