{"id":23178417,"url":"https://github.com/bn-l/dynio","last_synced_at":"2026-03-17T02:15:53.231Z","repository":{"id":247763499,"uuid":"826784238","full_name":"bn-l/dynio","owner":"bn-l","description":"Converts all commands that run on the cli in windows, linux or macos to a spotlight-like omnibar","archived":false,"fork":false,"pushed_at":"2025-02-02T03:57:09.000Z","size":12247,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-02-10T10:24:17.180Z","etag":null,"topics":["cli","everything","gui","qalc","search","spotlight","stdout","terminal"],"latest_commit_sha":null,"homepage":"","language":"Svelte","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bn-l.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2024-07-10T11:21:27.000Z","updated_at":"2025-02-02T03:57:12.000Z","dependencies_parsed_at":"2025-02-02T04:22:24.183Z","dependency_job_id":"8e265936-20d9-47a4-b44c-0d2e2feaeeb5","html_url":"https://github.com/bn-l/dynio","commit_stats":null,"previous_names":["bn-l/dynio"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bn-l%2Fdynio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bn-l%2Fdynio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bn-l%2Fdynio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bn-l%2Fdynio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bn-l","download_url":"https://codeload.github.com/bn-l/dynio/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247276187,"owners_count":20912288,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["cli","everything","gui","qalc","search","spotlight","stdout","terminal"],"created_at":"2024-12-18T07:11:06.006Z","updated_at":"2026-03-17T02:15:53.223Z","avatar_url":"https://github.com/bn-l.png","language":"Svelte","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"./assets-repo/peach.png\" alt=\"Dynio logo\" width=\"80\"\u003e\n\n# Dynio\n\n### Wrap any cli command in a spotlight-like input bar\n\n[![Windows](https://img.shields.io/badge/Windows-0078D6?logo=windows\u0026logoColor=white)](#installation)\n[![macOS](https://img.shields.io/badge/macOS-000000?logo=apple\u0026logoColor=white)](#installation)\n[![Linux](https://img.shields.io/badge/Linux-FCC624?logo=linux\u0026logoColor=black)](#installation)\n\n\u003c/div\u003e\n\n\n\u003c!-- \u003cdiv align=\"center\"\u003e\n\u003cimg src=\"./assets-repo/open-closing-demo.webp\" alt=\"Opening and closing demo\" width=\"650\"\u003e\n\n*Demnstrating the opening and closing speed. No unnecessary animation. No fading in slowly. Here I'm on macos typing `obs` and thanks to the simple find command (see below), apps from all the application folders on macos are fuzzy sorted using fzf with files underneath.*\n\u003c/div\u003e --\u003e\n\n\u003c!-- \u003cbr /\u003e --\u003e\n\n---\n\n\u003cbr /\u003e\n\nThis provides a spotlight-like GUI to CLI commands. **You edit a yaml with the name of or path to the command and the app calls it and uses its output to create a UI**.\n\nFor example: Take the command `ls`. The app calls `ls` each time you press a key with everything you have in the input and then outputs the result as a scrollable and selectable list. You can set an \"activation\" on each list item (what happens when you select and press enter--this can be basically anything). You could configure the \"open\" activation which treats the line as a path to be opened* that `ls` outputs (`ls -d`).\n\n- Windows, macOS, Linux\n- Global shortcut (Alt/Option+Space) shows/hides instantly\n- Yaml config: Full schema with autocomplete in vscode. Paste the schema into an LLM and have it create a command.\n- LLM streaming: Chunk-based output for real-time LLM responses with `\u003cthink\u003e` block rendering\n\n\u003cbr /\u003e\n\n\\* Mac: `open \u003cpath\u003e`, Windows: `explorer.exe \u003cpath\u003e`, Linux: `xdg-open \u003cpath\u003e`. \n\n\n## Getting started\n\n1. [Install it](#installation)\n\n2. Go to `~/.config/dynio/cmd-config.yaml` on mac and linux, or `%USERPROFILE%\\.config\\dynio\\cmd-config.yaml` on windows\n\n3. Each top level of this file is the name of a \"command\" in the app (in the demo screeners below this is the badge with \"qalc\" or \"groq\" or \"find\") and below it is the config for the command. If you open the file in vscode you will have automatic linting and intellisense thanks to the json schema in the folder.\n\n4. At the top of this file, add a new entry:\n\nMacos and Linux:\n\n```yaml\nlist:\n    command: ls  # This is the CLI command to run with the content of the input box\n    description: List files\n    placeholderText: List files...\n    runOnEnter: true  # You press enter after typing a path\n    modeConfig:\n        mode: list\n        displayOptions: {}\n        activationOptions:\n            activateAction: copy\n```\n\nWindows:\n\n```yaml\nlist:\n    command: dir\n    description: List files\n    placeholderText: List files...\n    runOnEnter: true\n    modeConfig:\n        mode: list\n        displayOptions: {}\n        activationOptions:\n            activateAction: copy\n```\n\n(the full structure is [here](#command-config-structure))\n\nThat's it. Type a path in the input and press enter to list it. There are some examples below that can be copied and pasted but the possible commands are unlimited. Paste a link to this repo into your LLM of choice and get it to write a script to do anything. \n\nYou can put as many commands as you like in this file. Cmd or Ctrl + s will list all the commands with the hotkey number (another option) set for them.\n\n---\n\n## Demo: Calculator with Qalc\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"./assets-repo/qalc-demo-smaller.webp\" alt=\"Qalc calculator demo\" width=\"550\"\u003e\n\n*[Qalc](https://github.com/Qalculate/libqalculate) is a really cool calculator that understands almost plain-english input. The garish colors here come directly from qalc. I.e. this is parsing qalc's ascii escape chars*\n\u003c/div\u003e\n\n```yaml\nqalc:\n    command: qalc # command name or path to the command\n    arguments:\n        - -t\n        - -c\n        - -s\n        - \"upxrates 1\"\n    description: Calculator (Qalculate)\n    hotkeyNumber: 1\n    placeholderText: Calculate... \n    noOutputTimeoutMs: 100\n    modeConfig:\n        mode: single\n        displayOptions:\n            parseAnsiColors: true\n            json: false\n        activationOptions:\n            activateAction: copy # pressing enter copies the result to the clipboard\n```\n\n---\n\n## Demo: LLM Integration\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"./assets-repo/groq-demo-smaller.webp\" alt=\"Groq LLM demo\" width=\"550\"\u003e\n\n*Adding an LLM is just a matter of copying and pasting the curl command you get in the code preview panel on most [LLM playgrounds](https://aistudio.google.com/prompts/new_chat). You can get fancier also:*\n\u003c/div\u003e\n\n```yaml\ngroq:\n    command: \"node\"\n    arguments:\n        - \"/path/to/groq-ask.js\"\n    description: Ask Groq a question (uses compound model with web search)\n    hotkeyNumber: 3\n    placeholderText: Ask Groq...\n    runOnEnter: true\n    noOutputTimeoutMs: 2000\n    modeConfig:\n        mode: llm # \u003c-- !! Nota bene: This is the money mode for LLMs\n        displayOptions:\n            parseAnsiColors: false\n            thinkingDisplay: showWhileThinking\n            smallSize: 0.8\n            largeSize: 1\n            sizeBreakPoint: 100\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eExample Groq script (TypeScript)\u003c/b\u003e\u003c/summary\u003e\n\n\u003cbr /\u003e\n\nThis uses groq's compound model--which is nice because it has search and browser use. In my testing it had issues differentiating reasoning and actual output so I summarise everything using another LLM.\n\n```typescript\nimport { Groq } from \"groq-sdk\";\nimport process from \"node:process\";\n\nconst userPrompt = process.argv[2];\nif (!userPrompt) {\n    console.error(\"Usage: node groq-ask.js \u003cprompt\u003e\");\n    process.exit(1);\n}\n\nconst groq = new Groq({\n    apiKey: process.env.GROQ_API_KEY, // Noto bene: API key in env var\n});\n\n// Stage 1: Call compound model and stream reasoning wrapped in \u003cthink\u003e\u003c/think\u003e\nconst COMPOUND_SYSTEM_PROMPT = `\\\nInvestigate the user's questions thoroughly by reading high quality sources.\n- For technical questions, check the latest official documentation\n- For science questions, look at research papers, textbooks, or expert subreddits\n- For calculations, use your code interpreter tool\n`;\n\nconst compoundStream = await groq.chat.completions.create({\n    messages: [\n        { role: \"system\", content: COMPOUND_SYSTEM_PROMPT },\n        { role: \"user\", content: userPrompt },\n    ],\n    model: \"groq/compound\",\n    temperature: 1,\n    max_completion_tokens: 1024,\n    stream: true,\n    compound_custom: {\n        tools: {\n            enabled_tools: [\"web_search\", \"code_interpreter\", \"visit_website\"],\n        },\n    },\n});\n\nlet compoundOutput = \"\";\nprocess.stdout.write(\"\u003cthink\u003e\");\n\nfor await (const chunk of compoundStream) {\n    const delta = chunk.choices[0]?.delta;\n    if (!delta) continue;\n\n    const reasoning = delta.reasoning ?? \"\";\n    process.stdout.write(reasoning);\n\n    const content = delta.content ?? \"\";\n    compoundOutput += reasoning + content;\n    process.stdout.write(content);\n}\n\nprocess.stdout.write(\"\u003c/think\u003e\\n\");\n\n// Stage 2: Call Kimi model to summarize the compound output\nconst kimiSystemPrompt = `\\\nKeep your answer highly concise. Include a sources section below the answer\nlisting best sources from the research as bullet points with title as anchor text.\n`;\n\nconst kimiStream = await groq.chat.completions.create({\n    messages: [\n        { role: \"system\", content: kimiSystemPrompt },\n        { role: \"user\", content: `Examine this research:\\n\\n${compoundOutput}\\n\\nAnswer: \"${userPrompt}\"` },\n    ],\n    model: \"moonshotai/kimi-k2-instruct\",\n    temperature: 0.6,\n    max_completion_tokens: 4096,\n    stream: true,\n});\n\nfor await (const chunk of kimiStream) {\n    const content = chunk.choices[0]?.delta?.content ?? \"\";\n    process.stdout.write(content);\n}\n\nprocess.stdout.write(\"\\n\");\n```\n\u003c/details\u003e\n\n---\n\n## Demo: File Search\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"./assets-repo/find-demo-smaller.webp\" alt=\"File search demo\" width=\"550\"\u003e\n\n*This is extremely fast and shows system applications like TextEdit. You could get really fancy by adding [frecency](https://en.wikipedia.org/wiki/Frecency) to the find script and a custom activation script that updates frequency scores*\n\u003c/div\u003e\n\n```yaml\nfind:\n    command: /path/to/custom-find.sh\n    description: Search files using Spotlight. Apps shown first.\n    hotkeyNumber: 2\n    placeholderText: Search files\n    noOutputTimeoutMs: 150\n    modeConfig:\n        mode: list\n        displayOptions:\n            parseAnsiColors: true\n            stderrFilterRegex: \"\\\\[UserQueryParser\\\\]\"\n            maxLineLength: 160\n            lineSplitter: \"\\n\"\n            fontSize: 0.8\n        activationOptions:\n            activateAction: open\n            hideOnActivation: true\n            isPath: true\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eExample macOS find script (with fzf)\u003c/b\u003e\u003c/summary\u003e\n\n```bash\n#!/bin/bash\nquery=\"$1\"\n\n# Trigger TCC prompts for dynio to access protected folders (only prompts once). \n#  comment out after first exectution\nls ~/Desktop ~/Documents ~/Downloads \u003e/dev/null 2\u003e\u00261\n\n\n[[ ${#query} -le 2 ]] \u0026\u0026 exit 0\n\n{\n    # Application folders (not indexed by Spotlight)\n    ls -1d /System/Applications/*.app 2\u003e/dev/null\n    ls -1d /System/Applications/Utilities/*.app 2\u003e/dev/null\n    ls -1d /Applications/*.app 2\u003e/dev/null\n    ls -1d /Applications/Utilities/*.app 2\u003e/dev/null\n    # Non-applications via Spotlight (excluding home folder)\n    mdfind \"kMDItemFSName == '*$query*'c \u0026\u0026 kMDItemKind != 'Application'\" 2\u003e/dev/null | grep -v \"^$HOME\"\n} | fzf --filter \"$query\"\n```\n\u003c/details\u003e\n\n---\n\n## Installation\n\n**macOS (Homebrew):**\n```bash\nbrew install --cask bn-l/tap/dynio\n```\n\n\u003e **Note:** If installing directly from a `.dmg` (not via Homebrew), the app is not yet notarized so macOS may show \"app is damaged.\" Fix with:\n\u003e ```bash\n\u003e xattr -d com.apple.quarantine /Applications/dynio.app\n\u003e ```\n\n**All platforms:** Download the installer for your OS from [Releases](https://github.com/bn-l/dynio/releases).\n\n| Platform | Format |\n|----------|--------|\n| Windows  | `.exe` (NSIS installer) |\n| macOS    | `.dmg` |\n| Linux    | `.deb`, `.AppImage` |\n\n---\n\n## Configuration\n\nOn first launch, Dynio creates config files at:\n- **macOS/Linux**: `~/.config/dynio/` (or `$XDG_CONFIG_HOME/dynio/`)\n- **Windows**: `~/.config/dynio/`\n\n| File | Purpose |\n|------|---------|\n| `cmd-config.yaml` | Command definitions |\n| `general-settings.yaml` | App settings (shortcut, theme, etc.) |\n| `cmd-config-schema.json` | JSON schema for autocomplete |\n| `general-settings-schema.json` | JSON schema for autocomplete |\n| `dynio.log` | Debug logs |\n\nThe app watches its config directory and auto-restarts on changes.\n\n### General Settings\n\n```yaml\ndarkMode: auto                # auto | true | false (auto follows system preference)\ndefaultCommand: find          # Command to use on launch\nstartMinimised: false         # Start hidden\ninputFontSize: 1.8            # Input font size (rem)\nalwaysOnTop: false            # Keep window above others\nglobalShortcut: \"Option+Space\" # Toggle shortcut (macOS)\nhideOnLostFocus: true         # Hide when clicking outside\n```\n\n### Command Config Structure\n\nEach command entry supports:\n\n| Option | Description |\n|--------|-------------|\n| `command` | Path to executable or command name |\n| `arguments` | Array of command-line arguments |\n| `description` | Short description shown in selector |\n| `hotkeyNumber` | 1-9 for Cmd/Ctrl+N quick select |\n| `placeholderText` | Input placeholder text |\n| `noOutputTimeoutMs` | Delay before showing \"no output\" |\n| `runOnEnter` | If true, only run on Enter (not per-keystroke) |\n| `currentDir` | Working directory for the command |\n| `modeConfig` | Display mode configuration (see below) |\n\n### Display Modes\n\n**List mode** - For commands that output selectable items:\n```yaml\nmodeConfig:\n    mode: list\n    displayOptions:\n        maxLineLength: 200\n        lineSplitter: \"\\n\"\n        fontSize: 0.8\n        parseAnsiColors: true\n    activationOptions:\n        activateAction: open  # or \"copy\" or \"command\"\n        isPath: true\n        hideOnActivation: true\n```\n\n**Single mode** - For calculators, JSON APIs:\n```yaml\nmodeConfig:\n    mode: single\n    displayOptions:\n        json: true\n        jsonPath: \"choices.0.message.content\"\n        sizeBreakPoint: 25\n        largeSize: 1.5\n        smallSize: 1.2\n    activationOptions:\n        activateAction: copy\n```\n\n**LLM mode** - For streaming LLM output with markdown and thinking blocks:\n```yaml\nmodeConfig:\n    mode: llm\n    displayOptions:\n        thinkingDisplay: showWhileThinking  # none, keepHidden, showWhileThinking, show\n        thinkingOpenPattern: \"\u003cthinking\u003e|\u003cthink\u003e\"\n        thinkingClosePattern: \"\u003c/thinking\u003e|\u003c/think\u003e\"\n        smallSize: 0.8\n        largeSize: 1.0\n        sizeBreakPoint: 100\n```\n\n---\n\n## Hotkeys\n\n| Shortcut | Action |\n|----------|--------|\n| `Alt/Option + Space` | Show / Hide (configurable) |\n| `Cmd/Ctrl + S` | Show command selector |\n| `Cmd/Ctrl + 1-9` | Quick select command 1-9 |\n| `Escape` | Close tray / Clear input / Hide |\n| `Enter` | Activate selected item (list mode) |\n| `Cmd/Ctrl + Enter` | Activate when `runOnEnter: true` |\n| `Cmd/Ctrl + O` | Open containing folder (when `isPath: true`) |\n| `Ctrl + U/D` | Half-page scroll up/down |\n| `Up/Down` | Navigate list items |\n\n---\n\n## Activation Actions\n\nWhen you press Enter on a selected item:\n\n| Action | Behavior |\n|--------|----------|\n| `copy` | Copy extracted text to clipboard |\n| `open` | Open path/URL in default application |\n| `command` | Run a command with the text as argument |\n\nUse `extractorRegexBody` and `extractorGroup` to extract specific parts of each line.\n\n---\n\n## Tips\n\n### Windows\n[Scoop](https://github.com/ScoopInstaller/Scoop) is great for installing CLI tools:\n```powershell\nscoop bucket add extras\nscoop install qalculate      # Calculator\nscoop install everything-cli # Fast file search (requires Everything)\n```\n\n---\n\n## Output Processing\n\n**List and Single modes** read output line-by-line. Data displays when a newline (`\\n`) is received.\n\n**LLM mode** uses chunk-based reading instead, so tokens appear immediately without waiting for newlines.\n\n---\n\n## Privacy\n\n- Open source with signed builds\n- No data collection\n- Single update check on launch to this repository's releases (i.e. to github.com)\n- Can be built from source with `tauri build` (remove updater section from `tauri.conf.json`)\n\n---\n\n## Troubleshooting\n\n**Windows WebView**: On older Windows versions, WebView2 should auto-install. Manual install: https://go.microsoft.com/fwlink/p/?LinkId=2124703\n\n**Logs**: Check `~/.config/dynio/dynio.log` for debug output.\n\n**Config errors**: The app validates YAML against schemas on startup. Check logs for validation errors.\n\n---\n\n## License\n\n[AGPL-3.0](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbn-l%2Fdynio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbn-l%2Fdynio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbn-l%2Fdynio/lists"}