{"id":46446072,"url":"https://github.com/lookatwhataicando/codeoba","last_synced_at":"2026-06-29T10:00:44.706Z","repository":{"id":367558714,"uuid":"1277802511","full_name":"LookAtWhatAiCanDo/Codeoba","owner":"LookAtWhatAiCanDo","description":"Cross-tool search indexer and concept-matching semantic searcher for AI assistant logs (Aider, Antigravity, Claude Code, Codex, Copilot, Cursor). Powered by Tauri + Rust.","archived":false,"fork":false,"pushed_at":"2026-06-29T00:56:23.000Z","size":1111,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-29T02:13:26.106Z","etag":null,"topics":["aider","aider-ai","antigravity","antigravity-ai","claude-code","codex","cursor","cursor-ai","github-copilot"],"latest_commit_sha":null,"homepage":"https://codeoba.com","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LookAtWhatAiCanDo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-23T07:46:47.000Z","updated_at":"2026-06-29T00:35:47.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/LookAtWhatAiCanDo/Codeoba","commit_stats":null,"previous_names":["lookatwhataicando/codeoba-tauri","lookatwhataicando/codeoba"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/LookAtWhatAiCanDo/Codeoba","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LookAtWhatAiCanDo%2FCodeoba","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LookAtWhatAiCanDo%2FCodeoba/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LookAtWhatAiCanDo%2FCodeoba/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LookAtWhatAiCanDo%2FCodeoba/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LookAtWhatAiCanDo","download_url":"https://codeload.github.com/LookAtWhatAiCanDo/Codeoba/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LookAtWhatAiCanDo%2FCodeoba/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34921807,"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-29T02:00:05.398Z","response_time":58,"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":["aider","aider-ai","antigravity","antigravity-ai","claude-code","codex","cursor","cursor-ai","github-copilot"],"created_at":"2026-03-05T22:41:31.711Z","updated_at":"2026-06-29T10:00:44.693Z","avatar_url":"https://github.com/LookAtWhatAiCanDo.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Codeoba — Tauri Desktop App (SolidJS + Rust)\n\nCodeoba is a platform-agnostic, zero-dependency, 100% local search application that aggregates and indexes conversation transcripts from major AI coding assistants (Claude Code, Cursor, Aider, Copilot, Codex, and Google Antigravity) into a unified desktop dashboard.\n\nThis is the Tauri-based port of the desktop application, combining a highly efficient Rust backend core with a modern SolidJS + TypeScript + Tailwind CSS frontend.\n\n---\n\n## 🛠️ Prerequisites\n\nBefore you run or compile the application, ensure you have the following installed on your machine:\n\n1. **Node.js** (v18.0.0 or newer)\n2. **Rust \u0026 Cargo** (v1.75.0 or newer)\n   * On macOS/Linux, install via: `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`\n   * On Windows, install using the official [Rustup installer](https://rustup.rs/)\n\n---\n\n## 🚀 Getting Started\n\nFollow these steps to run the application in your local development environment:\n\n### 1. Install Dependencies\nRun the package installation command in the root of the `Codeoba` directory:\n```bash\nnpm install\n```\n\n### 2. Run the Development Client\nLaunch the hot-reloading development server and compile/run the native desktop shell wrapper:\n```bash\nnpm run tauri dev\n# or\nnpm run tauri dev -- --release\n```\n*This command starts the Vite local server on port `1420` and loads the SolidJS UI into the native operating system webview. Changes to frontend views will hot-reload instantly. Changes to the Rust backend will trigger an automatic recompilation and restart.*\n\n---\n\n## 📖 Command-Line Interface (CLI) Usage\n\nCodeoba can be configured or executed directly from your terminal using custom command-line options.\n\n### 1. Terminal Search (Headless CLI)\nYou can run search operations directly in your shell without spawning the desktop graphical interface:\n```bash\n# Perform a standard lexical (keyword-based) search\ncargo run --manifest-path src-tauri/Cargo.toml -- search \"your search query\"\n\n# Perform an ONNX-powered semantic vector search\ncargo run --manifest-path src-tauri/Cargo.toml -- search \"your search query\" --semantic\n```\n\n### 2. Reset Window Geometry \u0026 Layout\nIf you need to reset the app's window sizes, positions, and sidebar widths back to the default 3/4 monitor dimensions (for instance, after screen configurations change or monitors are disconnected), pass the reset argument.\n\nBecause of how package managers (`npm`), the Tauri CLI, and the Rust compiler (`cargo`) chain command-line arguments, the number of double-dash (`--`) separators required varies depending on how you run the application:\n\n*   **Using `npm run tauri dev` (requires 3 separators):**\n    ```bash\n    # npm consumes the first --, Tauri CLI consumes the second --, and the third -- passes the flag to the app binary\n    npm run tauri dev -- -- -- --reset-window\n    \n    # Or with the short reset flag\n    npm run tauri dev -- -- -- --reset\n    ```\n\n*   **Using `npx tauri dev` (requires 2 separators):**\n    ```bash\n    # Tauri CLI consumes the first --, and the second -- passes the flag to the app binary\n    npx tauri dev -- -- --reset-window\n    ```\n\n*   **Using `cargo run` directly (requires 1 separator):**\n    ```bash\n    # Cargo consumes the -- and passes the flag to the app binary\n    cargo run --manifest-path src-tauri/Cargo.toml -- --reset-window\n    ```\n\n*   **Running the compiled production binary (no separator needed):**\n    ```bash\n    # Arguments are passed directly to the native executable\n    ./codeoba --reset-window\n    ```\n\n---\n\n## 🔒 Single Instance Mode\n\nCodeoba is configured to run as a single-instance application to prevent duplicate directory watchers, file logging conflicts, and database write contentions.\n\n### How it Works\nThe application uses the unique identifier `com.whataicando.codeoba` (defined in `tauri.conf.json`) to create a system-level lock (e.g., named pipe on Windows, Unix domain socket under `$TMPDIR` on macOS/Linux). \n\n* **Second Instance Interception**: If another instance of Codeoba is launched while the app is already running, the new instance detects the lock, forwards its launch arguments to the active instance, and immediately exits.\n* **Focus Restoration**: The running instance intercepts the second instance request, logs the arguments, and brings the main window to the foreground.\n\n### Development Note\nBecause the single-instance lock is keyed by the application identifier, running a locally compiled development build (e.g., via `npm run tauri dev`) while an installed production build is open will treat the dev build as a second instance (focusing the production app and terminating the dev build immediately).\n\nTo run a development version concurrently with your production version for testing, you must pass a custom identifier to the dev command:\n```bash\nnpm run tauri dev -- --config '{\"identifier\": \"com.whataicando.codeoba.dev\"}'\n```\n\n---\n\n## 🧪 Testing\n\nTo execute Rust backend tests (including log parsers, search algorithms, and signature checks):\n```bash\ncargo test --manifest-path src-tauri/Cargo.toml\n```\n\n---\n\n## 📦 Building for Production\n\nTo compile and package the application locally (without requiring updater signing keys):\n```bash\nnpm run build:local\n```\n\nFor production builds (where updates are signed and verified using Minisign):\n```bash\n# Set private key and password before compiling\nexport TAURI_SIGNING_PRIVATE_KEY=\"your_private_key_content\"\nexport TAURI_SIGNING_PRIVATE_KEY_PASSWORD=\"your_key_password\"\nnpm run tauri build\n```\n*Tauri compiles the Rust source code in `--release` mode, minifies frontend SolidJS assets, bundles them into the binary, and packages the installer (`.dmg` on macOS, `.msi` on Windows, `.deb` on Linux).*\n\n---\n\n## 🏗️ Project Architecture Map\n\n*   **`src/` (Frontend)**: Styled with Tailwind CSS, SolidJS components manage search layouts, settings panes, markdown renderings, and UI themes.\n*   **`src-tauri/` (Backend)**: Rust crate that manages directory watchers (`notify`), SQLite cache databases (`rusqlite`), credential stores (`keyring`), ONNX semantic vector inference (`ort`), and signed WASM plugin loading (`wasmtime`).\n\n---\n\n## 🔄 Auto-Updates \u0026 CI/CD Release Pipeline\n\nCodeoba features secure, cryptographically-signed auto-updates hosted on GitHub Releases, powered by the Tauri v2 Updater.\n\n### 1. Cryptographic Update Signing\nBy default, the repository's [tauri.conf.json](src-tauri/tauri.conf.json) points to the development/staging proxy at:\n`https://dev.codeoba.com/api/update`\n\nDuring tagged production builds, the CI pipeline automatically rewrites this configuration to target the production update proxy at:\n`https://codeoba.com/api/update`\n\nThis proxy handles client telemetry logging and retrieves the signed `latest.json` bundle configuration directly from GitHub Releases. Update packages must be signed using a **Minisign** keypair:\n*   The public key is configured inside [tauri.conf.json](src-tauri/tauri.conf.json) under `plugins.updater.pubkey`.\n*   The private key is stored locally (ignored by Git) and must be provided as an environment variable (`TAURI_SIGNING_PRIVATE_KEY`) to compile updates.\n\n#### Local/Staging Testing\nBy default, the updater is disabled in the repository configuration (`\"active\": false` under `\"updater\"` in `tauri.conf.json`) to prevent unwanted network checks during development. Furthermore, the public key is cleared in the repo by default (`\"pubkey\": \"\"`).\n\nTo test update checking and download progress triggers locally (against either `dev.codeoba.com` or a local mock server on `localhost`), you must follow the verification and key registration steps documented in the [Local \u0026 Staging Update Testing Guide](docs/APP_SIGNING.md#🧪-local--staging-update-testing-guide).\n\n\nTo sign updates locally during a build, run:\n```bash\n# Set private key and password (if any) before compiling\nexport TAURI_SIGNING_PRIVATE_KEY=\"your_private_key_content\"\nexport TAURI_SIGNING_PRIVATE_KEY_PASSWORD=\"your_key_password\"\nnpm run tauri build\n```\nThis generates the platform installer together with a `.sig` signature file and updater configuration block.\n\n### 2. GitHub Actions CI/CD Pipeline\nA release pipeline is configured in [.github/workflows/build-desktop.yml](.github/workflows/build-desktop.yml). It triggers automatically under two conditions:\n\n1. **Staging / Dev Releases (Pushes to `main`)**: When code is pushed to `main`, the pipeline automatically builds and signs the packages using the staging key pair, publishes them under a unique pre-release tag (e.g. `v0.1.0-124`), and prunes previous dev pre-releases and tags to keep the release list clean. Staging clients query `dev.codeoba.com/api/update` to receive updates.\n   * **Local Tag Cleanup:** To delete stale staging/dev tags from your local Git workspace (which aren't pruned automatically by standard git pulls), run:\n     ```bash\n     node scripts/prune-dev-releases.cjs --local\n     ```\n2. **Tagged Production Releases (`v*`)**: To publish a new stable production release:\n   \n   *   **Step 1: Bump the Version**: Synchronize the version across all project files to the target version (e.g. `0.1.3`) using the bump helper script:\n       ```bash\n       # Bump files locally\n       npm run bump -- 0.1.3\n       \n       # Bump files and automatically commit the change to main\n       npm run bump -- 0.1.3 --commit\n       ```\n       *(This consistently updates `package.json`, `package-lock.json`, `tauri.conf.json`, `Cargo.toml`, and `Cargo.lock`).*\n\n        \u003e [!TIP]\n        \u003e **Automatic Stash Guard:** Running the bump command with the `--commit` flag automatically stashes any ongoing local changes (`git stash`) before modifying the files, commits the version changes cleanly, and then restores your workspace (`git stash pop`) in a `finally` block. This keeps the release commit isolated without polluting your active working directory.\n   *   **Step 2: Tag and Push**: Create and push a git tag matching the new version:\n       ```bash\n       git tag v0.1.3\n       git push origin v0.1.3\n       ```\n       *The pipeline compiles the stable binary using the tag name as the compiled version (e.g., `0.1.3`), and uploads the production `latest.json` manifest directly to the release page.*\n\n       \u003e [!IMPORTANT]\n       \u003e **Version Match Guard:** The CI release pipeline validates that the pushed tag version (e.g. `v0.1.3`) matches the static version in `package.json`. If they do not match, the CI job will fail immediately to prevent out-of-sync builds.\n\nFor complete instructions on setting up credentials, OIDC, keypairs, and rotation, see the detailed [App Signing Guide](docs/APP_SIGNING.md).\n\n#### Required GitHub Secrets and Variables\nTo allow the release action to compile, sign, and notarize the packages successfully, configure the following secrets and variables under **Settings \u003e Secrets and variables \u003e Actions** in your GitHub repository:\n\n##### Secrets (Sensitive)\n| Secret Name | Description | Platform |\n|---|---|---|\n| `CODEOBA_TAURI_UPDATE_PRIVATE_KEY_DEV` | Minisign private key content for staging/dev updates. | All (Updater) |\n| `CODEOBA_TAURI_UPDATE_PRIVATE_KEY_PASSWORD_DEV` | The password used to encrypt the dev minisign key. | All (Updater) |\n| `CODEOBA_TAURI_UPDATE_PRIVATE_KEY_PROD` | Minisign private key content for production updates. | All (Updater) |\n| `CODEOBA_TAURI_UPDATE_PRIVATE_KEY_PASSWORD_PROD` | The password used to encrypt the production minisign key. | All (Updater) |\n| `MACOS_CERTIFICATE_P12` | Base64-encoded Developer ID Application `.p12` file. | macOS |\n| `MACOS_CERTIFICATE_PASSWORD` | Password for the Developer ID Application `.p12` file. | macOS |\n| `MACOS_INSTALLER_CERTIFICATE_P12` | Base64-encoded Developer ID Installer `.p12` file. | macOS |\n| `MACOS_INSTALLER_CERTIFICATE_PASSWORD` | Password for the Developer ID Installer `.p12` file. | macOS |\n| `APPLE_ID_PASSWORD` | App-specific password generated on `appleid.apple.com`. | macOS |\n| `AZURE_CLIENT_ID` | Application (client) ID of your Entra ID app registration. | Windows |\n| `AZURE_TENANT_ID` | Directory (tenant) ID of your Azure subscription. | Windows |\n| `AZURE_SUBSCRIPTION_ID` | ID of your active Azure subscription. | Windows |\n\n##### Variables (Non-Sensitive)\n| Variable Name | Description | Platform |\n|---|---|---|\n| `CODEOBA_TAURI_UPDATE_PUBLIC_KEY_DEV` | Optional staging public key (overrides default in `tauri.conf.json`). | All (Updater) |\n| `CODEOBA_TAURI_UPDATE_PUBLIC_KEY_PROD` | Production public key (compiled into production builds). | All (Updater) |\n| `APPLE_ID` | Your Apple Developer email address. | macOS |\n| `APPLE_TEAM_ID` | Your 10-character Apple Developer Team ID. | macOS |\n| `AZURE_SIGNING_ACCOUNT_NAME` | The name of your Azure Artifact Signing Account. | Windows |\n| `AZURE_CERTIFICATE_PROFILE_NAME` | The name of your Azure Certificate Profile. | Windows |\n| `AZURE_TRUSTED_SIGNING_ENDPOINT` | Azure signing service endpoint (e.g. `https://cus.codesigning.azure.net/`). | Windows |\n\n### 3. CI/CD Linker, Cache, and Notarization Optimizations\nTo support compilation of native dependencies in Rust (such as `esaxx-rs` and `wasmtime`) and run efficient packaging pipelines across different operating systems, the workflow has been optimized with the following configurations:\n\n* **Dynamic MSVC C Runtime Linking (`ESAXX_DYNAMIC_LINK=1`):**  \n  Windows MSVC builds use the dynamic CRT (`/MD`) by default. However, some dependencies like `esaxx-rs` historically force static CRT linking (`/MT`), causing `LNK2038` linker mismatches. The workflow compiles a patched dynamic-link-enabled fork and sets `ESAXX_DYNAMIC_LINK: '1'` globally to ensure consistent CRT linkage.\n* **Automatic Workflow Cache Invalidation:**  \n  The Rust cache step uses `prefix-key: ${{ hashFiles('.github/workflows/build-desktop.yml') }}`. This automatically invalidates the cache whenever the build configuration or environment variables are modified, preventing stale caching issues.\n* **Skip Notarization Polling (`SKIP_STAPLING: 'true'`):**  \n  By default, macOS notarization wait times can be highly unpredictable, taking hours for complex binaries that contain JIT compilers or embedded runtimes (such as `wasmtime`). The workflow introduces a global `SKIP_STAPLING` environment variable (default: `'true'`). When enabled, the workflow runs `tauri build -- --skip-stapling`, which submits the bundle to Apple's notarization server but returns immediately. Gatekeeper will verify the notarization online when online macOS clients first run the app. Setting `SKIP_STAPLING` to `'false'` restores full polling and stapling.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flookatwhataicando%2Fcodeoba","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flookatwhataicando%2Fcodeoba","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flookatwhataicando%2Fcodeoba/lists"}