{"id":51174127,"url":"https://github.com/numikel/kprun","last_synced_at":"2026-06-27T02:31:11.346Z","repository":{"id":367184042,"uuid":"1277293620","full_name":"numikel/kprun","owner":"numikel","description":"Local secrets injector for developers and AI agent workflows — KeePass vault, OS keychain unlock, per-process env injection.","archived":false,"fork":false,"pushed_at":"2026-06-24T22:38:17.000Z","size":284,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-25T00:07:10.525Z","etag":null,"topics":["cli","developer-tools","environment-variables","keepass","keepassxc","mcp","model-context-protocol","rust","secrets-management","security"],"latest_commit_sha":null,"homepage":"https://github.com/numikel/kprun#readme","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/numikel.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","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-06-22T19:04:01.000Z","updated_at":"2026-06-24T22:38:21.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/numikel/kprun","commit_stats":null,"previous_names":["numikel/kprun"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/numikel/kprun","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numikel%2Fkprun","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numikel%2Fkprun/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numikel%2Fkprun/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numikel%2Fkprun/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/numikel","download_url":"https://codeload.github.com/numikel/kprun/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numikel%2Fkprun/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34839888,"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":["cli","developer-tools","environment-variables","keepass","keepassxc","mcp","model-context-protocol","rust","secrets-management","security"],"created_at":"2026-06-27T02:31:10.487Z","updated_at":"2026-06-27T02:31:11.340Z","avatar_url":"https://github.com/numikel.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# kprun v0.2.3\n\n[![CI](https://github.com/numikel/kprun/actions/workflows/ci.yml/badge.svg)](https://github.com/numikel/kprun/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n![Rust](https://img.shields.io/badge/Rust-1.88.0-orange?logo=rust)\n![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey)\n\n![kprun demo](docs/kprun.gif)\n\n**Local secrets injector for developers and AI agent workflows.** KeePass `.kdbx` vault (KeePassXC-compatible), OS keychain unlock, per-process env injection — not session-wide.\n\n[Releases](https://github.com/numikel/kprun/releases) · [Changelog](CHANGELOG.md) · [Install](#installation) · [Quick start](#quick-start) · [Coding agents \u0026 OpenRouter](#coding-agents-and-openrouter) · [MCP integration](#mcp-integration) · [Security model](#security-model)\n\n---\n\n## About\n\nkprun stores API keys and tokens in a KeePass database on your machine. It unlocks the vault via `KPRUN_KEYFILE`, the OS credential store, or an interactive prompt, then injects secrets as environment variables into **one child process** only. Nothing is exported to your shell profile, nothing lands in MCP stdout.\n\nTypical uses:\n\n- Run MCP servers (`npx …`) without pasting tokens into client config files\n- Launch coding agents (Claude Code, Hermes, Junie, AGY, …) with OpenRouter env vars injected for one session only\n- Launch dev tools with scoped secrets (`kprun run openai -- python app.py`)\n- Manage a dedicated **dev-secrets** vault separate from your personal password manager\n\n## How it works\n\n```mermaid\nflowchart LR\n    subgraph without [\"Without kprun\"]\n        direction TB\n        W1[\"shell exports GITHUB_TOKEN=…\"]\n        W1 --\u003e|\"secrets in every child\"| W2[\"all processes inherit env\"]\n    end\n\n    subgraph with [\"With kprun\"]\n        direction TB\n        K1[\"kprun run github -- npx @mcp/server-github\"]\n        K1 --\u003e K2[\"unlock vault\u003cbr/\u003e(keyfile → keyring → prompt)\"]\n        K2 --\u003e K3[\"read entry 'github' custom fields\"]\n        K3 --\u003e K4[\"inject env into child only\"]\n        K4 --\u003e K5[\"inherit stdio; audit log (key names only)\"]\n    end\n```\n\nUnlock priority: `KPRUN_KEYFILE` → OS keystore (`kprun` / `master`) → hidden stderr prompt.\n\n## Features\n\n- ✅ **KeePass / KeePassXC vault** — entry title = service name; custom string fields = env var names\n- ✅ **Per-process injection** — `kprun run` opens the vault read-only and spawns one child with merged env\n- ✅ **MCP-safe stdio** — `run` prints nothing on stdout; child owns stdin/stdout/stderr\n- ✅ **Full secret lifecycle** — `init`, `set`, `get`, `unset`, `delete`, `export`, `import`, `doctor`\n- ✅ **Audit log** — JSON lines with entry names and injected key names; **never values**\n- ✅ **Cross-platform** — Linux, macOS, Windows (PATHEXT-aware spawn, keyring v1)\n- ✅ **RTK-style install** — `install.sh` / `install.ps1` with SHA-256 checksum verify\n- ✅ **CI matrix** — fmt, clippy, tests on ubuntu/windows/macos; release assets on tag `v*`\n\n## Requirements\n\n- **Rust**: 1.88.0+ (to build from source)\n- **OS**: Linux, macOS, or Windows\n- **Optional**: [KeePassXC](https://keepassxc.org/) to create or edit `.kdbx` files\n- **MCP client**: Cursor, Claude Code, or any tool that spawns a subprocess over stdio\n\n## Installation\n\n### Quick install (Linux / macOS)\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/numikel/kprun/refs/heads/main/scripts/install.sh | sh\n```\n\nInstalls to `~/.local/bin` by default. Override with `KPRUN_INSTALL_DIR`. Skip PATH changes with `KPRUN_NO_MODIFY_PATH=1`.\n\n\u003e Add to PATH manually if needed:\n\u003e\n\u003e ```bash\n\u003e echo 'export PATH=\"$HOME/.local/bin:$PATH\"' \u003e\u003e ~/.bashrc   # or ~/.zshrc\n\u003e ```\n\n### Quick install (Windows)\n\n```powershell\nirm https://raw.githubusercontent.com/numikel/kprun/refs/heads/main/scripts/install.ps1 | iex\n```\n\nDefault install dir: `%LOCALAPPDATA%\\kprun\\bin`. Adds user `Path` unless `KPRUN_NO_MODIFY_PATH=1`.\n\nOpen a **new terminal**, then verify:\n\n```bash\nkprun --version\n```\n\n### Pre-built binaries\n\nDownload from [GitHub Releases](https://github.com/numikel/kprun/releases) (after the first tag):\n\n| Platform | Asset |\n|----------|-------|\n| Linux x86_64 | `kprun-x86_64-unknown-linux-gnu.tar.gz` |\n| Linux arm64 | `kprun-aarch64-unknown-linux-gnu.tar.gz` |\n| macOS Intel | `kprun-x86_64-apple-darwin.tar.gz` |\n| macOS Apple Silicon | `kprun-aarch64-apple-darwin.tar.gz` |\n| Windows | `kprun-x86_64-pc-windows-msvc.zip` + standalone `kprun.exe` |\n\nVerify with `checksums.txt` from the same release unless `KPRUN_SKIP_CHECKSUM=1`.\n\n### Build from source\n\n```bash\ngit clone https://github.com/numikel/kprun.git\ncd kprun\ncargo build --release -p kprun\n# binary: target/release/kprun (or target/\u003ctriple\u003e/release/kprun)\n```\n\nOr install into Cargo bin dir:\n\n```bash\ncargo install --path crates/kprun\n```\n\n## Quick start\n\n```bash\n# 1. Create vault (master password → OS keychain by default)\nkprun init\n\n# 2. Store secrets (entry title = service; fields = env vars)\nkprun set github GITHUB_TOKEN=ghp_xxx\n\n# 3. Inject into a child process\nkprun run github -- npx -y @modelcontextprotocol/server-github\n```\n\nWindows (after `install.ps1`):\n\n```powershell\nkprun init\nkprun set github GITHUB_TOKEN=ghp_xxx\nkprun run github -- npx -y @modelcontextprotocol/server-github\n```\n\n### Attach an existing KeePassXC database\n\n```bash\nkprun init --db /path/to/existing.kdbx\n```\n\nVerifies unlock and optionally stores the master password in the OS keychain. Does **not** recreate the database.\n\n## Coding agents and OpenRouter\n\nMany terminal coding agents read API keys and provider URLs from **environment variables**. Instead of exporting them in `~/.bashrc` or `~/.zshrc` (where every process inherits them), store the OpenRouter profile in your vault and launch the agent through `kprun run`.\n\nThe `--` separator is required — it marks where vault entry names end and the child command begins:\n\n```text\nkprun run \u003centry\u003e -- \u003cagent-command\u003e [args...]\n```\n\n### One-time vault setup (Claude Code / OpenRouter)\n\nPer [OpenRouter's Claude Code guide](https://openrouter.ai/docs/cookbook/coding-agents/claude-code-integration), Claude Code expects these variables. Store them under one vault entry (title = `openrouter` here; any name works):\n\n```bash\nkprun set openrouter \\\n  OPENROUTER_API_KEY=sk-or-... \\\n  ANTHROPIC_BASE_URL=https://openrouter.ai/api \\\n  ANTHROPIC_AUTH_TOKEN=sk-or-... \\\n  ANTHROPIC_API_KEY=\n```\n\nKeePass fields are literal values — set `ANTHROPIC_AUTH_TOKEN` to the same key as `OPENROUTER_API_KEY`. Set `ANTHROPIC_API_KEY` to an **empty** string to avoid auth conflicts with a cached Anthropic login (run `/logout` inside Claude Code once if you previously signed in with Anthropic).\n\nOptional model overrides (also from the OpenRouter docs):\n\n```bash\nkprun set openrouter \\\n  ANTHROPIC_DEFAULT_SONNET_MODEL='~anthropic/claude-sonnet-latest' \\\n  ANTHROPIC_DEFAULT_OPUS_MODEL='~anthropic/claude-opus-latest'\n```\n\n### Launch examples\n\n**Claude Code** — secrets stay in the child process only; your shell profile stays clean:\n\n```bash\nkprun run openrouter -- claude\n```\n\nWindows PowerShell:\n\n```powershell\nkprun run openrouter -- claude\n```\n\nVerify inside Claude Code with `/status` (auth token: `ANTHROPIC_AUTH_TOKEN`, base URL: `https://openrouter.ai/api`).\n\n**Antigravity CLI (`agy`)** — the CLI authenticates via Google by default. If you use OpenRouter through a plugin, extension, or any workflow that reads `OPENROUTER_API_KEY` from the environment, inject it the same way:\n\n```bash\nkprun set openrouter OPENROUTER_API_KEY=sk-or-...\nkprun run openrouter -- agy\n```\n\n**Hermes Agent** — Nous Research's terminal agent reads `OPENROUTER_API_KEY` from the environment (alternative to `~/.hermes/.env`). Model and provider stay in `~/.hermes/config.yaml`; see [OpenRouter's Hermes guide](https://openrouter.ai/docs/cookbook/coding-agents/hermes-integration):\n\n```bash\nkprun set openrouter OPENROUTER_API_KEY=sk-or-...\nkprun run openrouter -- hermes\n# or: kprun run openrouter -- hermes --tui\n```\n\n**Junie CLI** — JetBrains' terminal agent uses OpenRouter as a native BYOK provider via `JUNIE_OPENROUTER_API_KEY`; see [OpenRouter's Junie guide](https://openrouter.ai/docs/cookbook/coding-agents/junie):\n\n```bash\nkprun set openrouter \\\n  OPENROUTER_API_KEY=sk-or-... \\\n  JUNIE_OPENROUTER_API_KEY=sk-or-...\nkprun run openrouter -- junie\n```\n\nHeadless CI example (same injected env, no shell profile):\n\n```bash\nkprun run openrouter -- junie \"Review and fix any code quality issues in the latest commit\"\n```\n\n**GitHub Copilot CLI** — Copilot fixes the model at startup and speaks OpenAI-compatible APIs; env injection alone is awkward for live model switching. For Copilot CLI (and Codex CLI with OpenRouter), the author recommends **[copilot-cli-custom-proxy](https://github.com/numikel/copilot-cli-custom-proxy)** instead: a local tray proxy that swaps models on the fly, injects the API key from memory, and launches Copilot/Codex with the right env — without putting keys in your shell profile.\n\n| Agent | kprun fit | Notes |\n|-------|-----------|-------|\n| Claude Code | ✅ Best fit | Env-based OpenRouter setup; see [OpenRouter docs](https://openrouter.ai/docs/cookbook/coding-agents/claude-code-integration) |\n| Hermes Agent | ✅ Best fit | `OPENROUTER_API_KEY`; config in `~/.hermes/config.yaml`; see [OpenRouter docs](https://openrouter.ai/docs/cookbook/coding-agents/hermes-integration) |\n| Junie CLI | ✅ Best fit | `JUNIE_OPENROUTER_API_KEY`; see [OpenRouter docs](https://openrouter.ai/docs/cookbook/coding-agents/junie) |\n| Antigravity CLI (`agy`) | ⚠️ Partial | Default auth is Google; use kprun when the workflow reads env vars |\n| Copilot CLI / Codex CLI | ❌ Use proxy | Prefer [copilot-cli-custom-proxy](https://github.com/numikel/copilot-cli-custom-proxy) |\n\nOne OpenRouter key can power every tool above; generate it at [openrouter.ai/settings/keys](https://openrouter.ai/settings/keys).\n\n## Configuration\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `KPRUN_DB` | `~/.kprun/secrets.kdbx` | Path to the KeePass database |\n| `KPRUN_KEYFILE` | — | Path to a cryptographic key file (second factor) |\n| `KPRUN_LOG` | `~/.kprun/access.log` | Audit log path (JSON lines, key names only) |\n| `KPRUN_INSTALL_DIR` | `~/.local/bin` / `%LOCALAPPDATA%\\kprun\\bin` | Install script target |\n| `KPRUN_NO_MODIFY_PATH` | unset | Set to `1` to skip shell PATH updates |\n| `KPRUN_SKIP_CHECKSUM` | unset | Set to `1` to skip install checksum verify |\n| `KPRUN_VERSION` | latest release | Pin install script version |\n| `KPRUN_TEST_MASTER` | — | Test hook (only in builds compiled with `--features test-hooks`; not present in GitHub Release binaries): fixed master password for automation |\n\nInstall script env vars are documented in `scripts/install.sh` and `scripts/install.ps1`.\n\n## CLI reference\n\n```\nkprun init   [--db PATH] [--no-store] [--keyfile PATH]\nkprun run    \u003centry\u003e [entry2 ...] -- \u003ccommand\u003e [args...]\nkprun list   [--json]\nkprun get    \u003centry\u003e [--keys] [--reveal]\nkprun set    \u003centry\u003e KEY=val [KEY2=val2 ...]\nkprun unset  \u003centry\u003e KEY [KEY2 ...]\nkprun delete \u003centry\u003e\nkprun export [--format json|dotenv] [--stdout] [--reveal]\nkprun import \u003cfile\u003e [--merge]\nkprun doctor [--mcp \u003centry\u003e]\nkprun deinit\n```\n\nNotes:\n\n- `get` and `export` show key **names** by default; use `--reveal` only when you need values (stderr warning + audit).\n- `run` inherits stdio to the child and writes **nothing** to stdout (MCP-safe).\n- `import` without `--merge` replaces vault content; structure-only dotenv exports are rejected to prevent accidental wipes.\n- Exit codes: `1` for DB not found, entry not found, unlock failed, DB locked; child exit code propagated; empty injection → `0` with stderr warning.\n\n### Export and import\n\n`import` accepts JSON (`.json`) or kprun dotenv (`.env`). JSON is the structured format from `kprun export --stdout`. Dotenv is **not** a generic project `.env` file — it is the round-trip format produced by `kprun export --format dotenv`.\n\nEach vault **entry** is a comment line with the entry title, followed by `KEY=value` lines. Separate entries with a blank line:\n\n```env\n# github\nGITHUB_TOKEN=\"ghp_xxx\"\n\n# postgres\nDATABASE_URL=\"postgres://local\"\n```\n\nTo migrate a flat project `.env` (keys only, no title comments), add one title line at the top. All following keys land in that entry until the next `# title` or blank line:\n\n```env\n# default\nOPENAI_API_KEY=\"sk-...\"\nLANGFUSE_SECRET_KEY=\"sk-lf-...\"\n```\n\nThen import:\n\n```bash\nkprun import secrets.env --merge   # add/update keys; keep other vault entries\nkprun import secrets.env           # replace vault content with file entries\n```\n\nInspect the canonical dotenv layout with:\n\n```bash\nkprun export --format dotenv --stdout --reveal\n```\n\nStructure-only dotenv exports (key names in `#` comments, no values) cannot be imported — re-export with `--reveal` first.\n\n## MCP integration\n\nMCP clients spawn a command and talk over the child's stdio. Use `kprun run` as a transparent wrapper.\n\n**Linux / macOS** (with `kprun` on `PATH`):\n\n```json\n{\n  \"mcpServers\": {\n    \"github\": {\n      \"command\": \"kprun\",\n      \"args\": [\"run\", \"github\", \"--\", \"npx\", \"-y\", \"@modelcontextprotocol/server-github\"]\n    }\n  }\n}\n```\n\n**Windows** (prefer full path — some MCP clients do not resolve `PATH` reliably):\n\n```json\n{\n  \"mcpServers\": {\n    \"github\": {\n      \"command\": \"C:\\\\Users\\\\you\\\\AppData\\\\Local\\\\kprun\\\\bin\\\\kprun.exe\",\n      \"args\": [\"run\", \"github\", \"--\", \"npx\", \"-y\", \"@modelcontextprotocol/server-github\"]\n    }\n  }\n}\n```\n\nGenerate a ready-to-paste fragment:\n\n```bash\nkprun doctor --mcp github\n```\n\nFor other entries, append the MCP server command after `--`:\n\n```bash\nkprun doctor --mcp qdrant -- npx -y @modelcontextprotocol/server-qdrant\n```\n\nWithout a child command, generic entries emit `[\"run\", \"\u003centry\u003e\", \"--\"]` and a stderr hint — paste the server command into `args` manually or re-run with `--`.\n\nAfter editing MCP config, check `git diff` — some tools may write secrets back to disk.\n\n## Automation and cron\n\nWhen no interactive session is available (cron, Task Scheduler), the OS keychain may be unavailable. Use a **keyfile**:\n\n```bash\nkprun init --keyfile ~/.kprun/master.key\nexport KPRUN_KEYFILE=~/.kprun/master.key\nkprun run myservice -- /path/to/script.sh\n```\n\nThe keyfile is generated by kprun (64 random bytes), not a plaintext password file. Restrict permissions (`chmod 600` on Unix; user-only ACL on Windows).\n\nFor scheduled jobs, set `KPRUN_DB` and `KPRUN_KEYFILE` in the job environment. Use `--no-store` at `init` if you do not want the master password in the keychain.\n\n## Project structure\n\n```\nkprun/\n├── crates/\n│   ├── kprun-core/          # vault, unlock, inject, audit (no clap / Command)\n│   └── kprun/               # CLI binary, spawn, commands\n├── scripts/\n│   ├── install.sh           # RTK-style installer (Unix)\n│   └── install.ps1          # Windows installer\n├── tests/                   # integration tests (run, init, manage, export, doctor, …)\n├── .github/workflows/\n│   ├── ci.yml               # fmt, clippy, test matrix\n│   └── release.yml          # cross-build + checksums on tag v*\n└── docs/\n    ├── kprun.gif            # demo animation\n    └── changelogs/          # per-version release notes\n```\n\n## Development\n\n### Setup\n\n```bash\ngit clone https://github.com/numikel/kprun.git\ncd kprun\ncargo build -p kprun\n```\n\n### Running tests\n\n```bash\ncargo test --all\n```\n\nKeePassXC compatibility test (optional, local fixture):\n\n```bash\n# Create tests/fixtures/keepassxc.kdbx in KeePassXC (gitignored)\n# Entry title: fixture; custom attribute: FIXTURE_KEY\nKPRUN_KEEPASSXC_FIXTURE=1 KPRUN_TEST_MASTER='your-pass' \\\n  cargo test reads_keepassxc_fixture -- --ignored\n```\n\n### Code quality (matches CI)\n\n```bash\ncargo fmt --all -- --check\ncargo clippy --all-targets --all-features -- -D warnings\ncargo test --all\n```\n\n## Security model\n\n- Use a dedicated **dev-secrets** vault, not your personal password manager.\n- Report vulnerabilities per [SECURITY.md](SECURITY.md) (**contact@michalsk.pl**); do not file public issues for security bugs.\n- Secrets exist in the **child process environment** after injection (same model as other secret runners).\n- Audit log records entry names and injected key names — **never values**.\n- Do not use `setx` or global shell profiles for API keys.\n- Pass only the entries a command needs: `kprun run openai -- python script.py`, not every secret at once.\n- `export --reveal` and `get --reveal` print values to the terminal — use deliberately.\n\n## Releases\n\nReleases are published when a maintainer tags `vX.Y.Z` and pushes:\n\n```bash\ngit tag vX.Y.Z\ngit push origin main --tags\n```\n\nCI validates the changelog file and version match, builds release binaries for five targets, and publishes a GitHub Release whose body comes from [docs/changelogs/vX.Y.Z.md](docs/changelogs/).\n\n## Contributing\n\n1. Fork the repository.\n2. Create a feature branch (`git checkout -b feat/my-change`).\n3. Commit using **Conventional Commits 1.0.0** (e.g. `feat(cli): add example command`, `fix(core): handle locked db`).\n4. Add or update tests for behavior changes.\n5. Run `cargo fmt`, `cargo clippy --all-targets --all-features -- -D warnings`, and `cargo test --all`.\n6. Open a pull request against `main`.\n\nUse English for code, comments, and CLI messages.\n\n## License\n\nMIT License — see [LICENSE](LICENSE).\n\n## Author\n\n**@numikel**\n\n---\n\n**Security note:** kprun injects secrets into child process environments. Treat the vault file, keyfile, and audit log as sensitive. Do not commit `.kdbx` files or keyfiles to version control.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnumikel%2Fkprun","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnumikel%2Fkprun","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnumikel%2Fkprun/lists"}