{"id":51073644,"url":"https://github.com/kennykankush/constant","last_synced_at":"2026-06-23T12:33:31.144Z","repository":{"id":362803551,"uuid":"1259782838","full_name":"kennykankush/constant","owner":"kennykankush","description":"One conversation, any agent runtime — live-switch Codex, Claude Code, and OpenCode mid-thread, with a durable record of every carry","archived":false,"fork":false,"pushed_at":"2026-06-18T12:26:10.000Z","size":713,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-18T14:22:27.437Z","etag":null,"topics":["agent-cli","agents","claude-code","cli","codex","developer-tools","gemini-cli","local-first","opencode","rust","terminal"],"latest_commit_sha":null,"homepage":"","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/kennykankush.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-04T21:17:08.000Z","updated_at":"2026-06-18T12:24:52.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kennykankush/constant","commit_stats":null,"previous_names":["kennykankush/constant"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/kennykankush/constant","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kennykankush%2Fconstant","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kennykankush%2Fconstant/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kennykankush%2Fconstant/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kennykankush%2Fconstant/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kennykankush","download_url":"https://codeload.github.com/kennykankush/constant/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kennykankush%2Fconstant/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34688145,"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-23T02:00:07.161Z","response_time":65,"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":["agent-cli","agents","claude-code","cli","codex","developer-tools","gemini-cli","local-first","opencode","rust","terminal"],"created_at":"2026-06-23T12:33:29.658Z","updated_at":"2026-06-23T12:33:31.124Z","avatar_url":"https://github.com/kennykankush.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eConstant\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eOne conversation. Any agent runtime.\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"status: alpha\" src=\"https://img.shields.io/badge/status-alpha-f59e0b?style=flat-square\"\u003e\n  \u003cimg alt=\"built with Rust\" src=\"https://img.shields.io/badge/built%20with-Rust-b7410e?style=flat-square\u0026logo=rust\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"runtimes: Codex, Claude, OpenCode + Gemini source\" src=\"https://img.shields.io/badge/runtimes-Codex%20%2B%20Claude%20%2B%20OpenCode%20%2B%20Gemini%20(src)-111827?style=flat-square\"\u003e\n  \u003cimg alt=\"local first\" src=\"https://img.shields.io/badge/local--first-no%20API%20proxy-10b981?style=flat-square\"\u003e\n  \u003cimg alt=\"license: MIT\" src=\"https://img.shields.io/badge/license-MIT-2563eb?style=flat-square\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#install\"\u003eInstall\u003c/a\u003e ·\n  \u003ca href=\"#quickstart\"\u003eQuickstart\u003c/a\u003e ·\n  \u003ca href=\"#the-record\"\u003eThe Record\u003c/a\u003e ·\n  \u003ca href=\"#headless-cli\"\u003eHeadless CLI\u003c/a\u003e ·\n  \u003ca href=\"#trust-boundary\"\u003eTrust Boundary\u003c/a\u003e ·\n  \u003ca href=\"#how-it-works\"\u003eHow It Works\u003c/a\u003e ·\n  \u003ca href=\"#development\"\u003eDevelopment\u003c/a\u003e\n\u003c/p\u003e\n\nConstant is a local-first continuity tool for agent CLIs. Start a thread in\nCodex, carry it to Claude Code or OpenCode, then carry it back without\nre-explaining the work.\n\n```text\nCodex changes.\nClaude changes.\nThe conversation stays constant.\n```\n\nConstant is early software. It works by reading and writing local runtime session\nfiles, so read the trust boundary below before using it on important sessions.\n\n## What It Is\n\nConstant has three surfaces:\n\n- `constant host`: run one agent CLI at a time inside a native PTY and switch the\n  live runtime with a tmux-style prefix key. A persistent status bar shows the\n  active runtime and your place in the thread.\n- `constant carry`: headless carry into a target runtime's native session and\n  print the resume command.\n- the record: every carry first writes the distilled conversation as a neutral\n  snapshot under `~/.constant/snapshots/`, so any hop can be listed\n  (`constant snapshots`), reprinted (`constant restore`), or re-hosted\n  (`constant resume`) — even if the native session files are later deleted.\n\nIn host mode, the child keeps its normal terminal UI, colors, keybindings, and\nresume behavior. Constant sits outside it, watches for a prefix key, and swaps\nthe active runtime when you ask.\n\n```text\nconstant host codex\n\nyou talk to Codex\nCtrl-B c  -\u003e  Claude Code continues the same thread\nCtrl-B o  -\u003e  OpenCode continues it\nCtrl-B x  -\u003e  Codex takes it back\n```\n\nThe switch is not a pasted summary. Constant reads the source runtime's local\nsession, distills it to the conversation, records a snapshot, writes a\ntarget-native session, and starts the target runtime with its own resume\ncommand. Every carry prints a receipt of exactly what moved:\n\n```text\ncobalt-37 · fix-the-bug · ch02 codex → claude · continue ·\ncarried 14 turns · dropped 6 tool events · 2 redactions\n```\n\nThe same carry path is available without opening a hosted terminal:\n\n```bash\nconstant carry --from codex --to claude\n# carried -\u003e claude session \u003cid\u003e\n# carried 14 turns · dropped 6 tool events · 2 redactions\n# resume with: claude -r \u003cid\u003e\n```\n\n## Install\n\nIf you are on macOS and use Homebrew, use this:\n\n```bash\nbrew tap kennykankush/constant https://github.com/kennykankush/constant\nbrew install kennykankush/constant/constant\nconstant --version\nconstant doctor\n```\n\nThat is the recommended install path. The explicit\n`kennykankush/constant/constant` name avoids ambiguity with any other formula\nnamed `constant`.\n\nYou also need the agent CLIs you want to switch between:\n\n```bash\ncodex --version     # optional, for Codex support\nclaude --version    # optional, for Claude Code support\nopencode --version  # optional, for OpenCode support\ngemini --version    # optional, for Gemini (carry source)\n```\n\n### Alternative: curl installer\n\nUse this if you do not want Homebrew, or you are on Linux x86_64:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/kennykankush/constant/main/scripts/install.sh | sh\nconstant --version\nconstant doctor\n```\n\nThe installer downloads the latest prebuilt binary, verifies its checksum,\nsmoke-tests it, and installs it to `~/.local/bin`. If `~/.local/bin` is not on\nyour `PATH`, it prints the exact export line to add.\n\nSupported prebuilt targets:\n\n- macOS Apple Silicon\n- macOS Intel\n- Linux x86_64\n\n### Developers: install from source\n\nUse this only if you are hacking on Constant or want to build directly from the\nrepo:\n\n```bash\ncargo install --git https://github.com/kennykankush/constant --locked\n```\n\nFrom a local checkout:\n\n```bash\ncargo install --path . --locked\ncargo build --release\n./target/release/constant --version\n```\n\n## Quickstart\n\nCheck your local runtime setup and current project state:\n\n```bash\nconstant doctor\nconstant status\n```\n\nHost Codex:\n\n```bash\nconstant host codex\n```\n\nInside a hosted session, the default prefix is `Ctrl-B`.\n\n| Keys | Action |\n| --- | --- |\n| `Ctrl-B` `c` | Continue in Claude Code, refreshing the existing Claude projection if one exists |\n| `Ctrl-B` `C` | Create a new Claude continuation |\n| `Ctrl-B` `x` | Continue in Codex |\n| `Ctrl-B` `X` | Create a new Codex continuation |\n| `Ctrl-B` `o` | Continue in OpenCode |\n| `Ctrl-B` `O` | Create a new OpenCode continuation |\n| `Ctrl-B` `t` | Toggle the cockpit — the chapter graph, with actions: `c`/`x`/`o` switch from inside it, `r` rename |\n| `Ctrl-B` `:` | Open the Constant command line (`switch claude`, `rename auth bug`, `quit`; Tab completes, ↑/↓ recall history) |\n| `Ctrl-B` `d` | Quit Constant (the hosted CLI exits with it) |\n| `Ctrl-B` `Ctrl-B` | Send a literal `Ctrl-B` to the child runtime |\n\nA status bar on the bottom row shows the hosted runtime, the thread position\n(`ch04·fix-the-bug`), and the prefix keys. The child is simply told the terminal\nis one row shorter — Constant stays a pass-through proxy, not a compositor.\nDisable it with `--no-bar`.\n\nIf you are already inside tmux, pick another prefix:\n\n```bash\nconstant host codex --prefix C-t\nCONSTANT_PREFIX=C-t constant host codex\n```\n\nEvery conversation gets a stable **handle** (`cobalt-37` — one color word + a\n2-digit tail, pinned in the ledger, collision-proof by registry) and a\n**title** (your `rename` wins forever; otherwise a runtime-generated title is\nharvested when one exists; otherwise the first contentful words). Carries are\n**chapters** (`ch04`): each chapter is one runtime's turn narrating the thread.\n\n```bash\nconstant rename auth bug          # name it; native pickers are re-stamped\nconstant resume cobalt-37         # handles are never ambiguous\n```\n\nRe-host a conversation later, straight from the ledger:\n\n```bash\nconstant resume                 # newest conversation in this directory\nconstant resume fix-the-bug     # match by slug or conversation id\nconstant resume --list --all    # see everything resumable\n```\n\n`resume` wakes the conversation's latest projection live in the harness. If\nevery native projection has been deleted, it reprints one from the latest\nrecord snapshot first.\n\nSee every agent conversation alive on the machine right now (any runtime,\nhosted or not — read-only):\n\n```bash\nconstant ps\n# live agent sessions (14):\n#   claude   01-15:29:00   fix-the-bug   fefd68b4-5ee…   ~/dev/fantopy-hadi\n#   codex    01-15:27:35   -             019e9a25-91e…   ~/dev/belvedere\n```\n\nShow the current Constant projections for this directory:\n\n```bash\nconstant trail\nconstant route\nconstant trail --all\n```\n\n`constant trail` shows the current projection per runtime. If the same projection\nwas updated multiple times, it is shown as `synced Nx` instead of repeated as a\nnew conversation. To inspect the raw append-only switch ledger:\n\n```bash\nconstant trail --events\n```\n\n`constant route` is the debug view. It reconstructs the fork graph Constant knows\nabout and labels projections with readable aliases like `codex[1]` and\n`claude[1.1]`.\n\nMove a conversation to another machine — the record travels, native sessions\nreprint on arrival:\n\n```bash\nconstant pack cobalt-37                  # → cobalt-37.constant-pack.json\n# copy the file to the other machine, then:\nconstant unpack cobalt-37.constant-pack.json\nconstant resume cobalt-37                # wakes from the record, same handle\n```\n\n## The Record\n\nEvery carry writes the distilled conversation to\n`~/.constant/snapshots/\u003cconversation\u003e/chNN-from-\u003cruntime\u003e.json` — atomically,\nowner-only, post-redaction, BEFORE the native copy is materialized. The neutral\nsnapshot is the durable record; native sessions are reprintable projections of\nit.\n\n```bash\nconstant snapshots            # list record volumes for this directory\nconstant snapshots --all\nconstant restore \u003csnapshot\u003e   # reprint a fresh native session from any hop\nconstant restore \u003csnapshot\u003e --to opencode\n```\n\n`restore` always mints a new session — it never overwrites anything, least of\nall the record. Restores are logged to the trail, so lineage stays joined. If a\nruntime update ever rejects Constant's sessions, or a cleanup deletes them, the\nconversation reprints from its record.\n\n## Headless CLI\n\nUse the headless commands when you want continuity without hosting an interactive\nterminal.\n\nList carryable sessions:\n\n```bash\nconstant sessions\nconstant sessions --from gemini --all\nconstant sessions --from opencode --titles   # OpenCode titles come from its own db\nconstant sessions --all --json\n```\n\nBy default, `sessions` scopes to the current directory. `--all` scans all known\nruntime stores. `--titles` reads transcripts to derive a preview title, so it is\nslower on large stores. In text output, `·` marks a session known to be empty\nwhen titles were requested.\n\nPreview a carry without writing anything:\n\n```bash\nconstant carry --from codex --to claude --dry-run\nconstant carry --session \u003cpath-or-session-id\u003e --to opencode --dry-run --json\n```\n\nCarry into the target runtime's native session and print the resume command:\n\n```bash\nconstant carry --from codex --to claude\nconstant carry --session ses_…  --to codex       # OpenCode ids resolve automatically\nconstant carry --session \u003cgemini session file\u003e --to claude\n```\n\nBy default, `carry` continues the current target projection for the conversation:\nif `codex[1]` already has `claude[1.1]`, another carry to Claude updates that\nsame Claude session. Use `--new` when you want a separate target continuation:\n\n```bash\nconstant carry --from codex --to claude --new\n# codex[1] -\u003e claude[1.2]\n```\n\nCarry tool history too (experimental):\n\n```bash\nconstant carry --from codex --to opencode --with-tools\n```\n\n`--with-tools` (also on `host` and `resume`) carries tool calls and results\nacross the boundary instead of dropping them. Every string in their payloads is\nredacted, oversized tool outputs are capped, and reasoning is never carried.\nThe receipt distinguishes `kept N tool events` from `dropped N tool events`.\n\n`distill` is kept as an alias for `carry`, but `carry` is the public verb.\n\nExport the distilled, redacted neutral IR:\n\n```bash\nconstant export --from codex --out thread.constant.json\nconstant export --session \u003cpath-or-session-id\u003e\n```\n\n`export` writes to `--out` when provided, otherwise it prints JSON to stdout. It\nrefuses to overwrite the source session.\n\n## Trust Boundary\n\nConstant does not claim shared native memory between agent CLIs. It reads visible\nlocal session evidence and authors a new session that the target runtime can\nresume.\n\nConstant currently writes:\n\n- `~/.claude/projects/\u003ccwd-slug\u003e/\u003cid\u003e.jsonl`\n- `~/.claude/history.jsonl`\n- `~/.codex/sessions/YYYY/MM/DD/rollout-\u003ctimestamp\u003e-\u003cid\u003e.jsonl`\n- `~/.codex/session_index.jsonl`\n- `~/.codex/state_5.sqlite`\n- the OpenCode store, via `opencode import` only (its own supported,\n  validating entry point — Constant never writes OpenCode's sqlite directly)\n- `~/.constant/trail.jsonl`, `~/.constant/snapshots/`, `~/.constant/cache/`\n\nGemini support is currently **read-only**: Constant loads gemini sessions as\ncarry sources and never writes into `~/.gemini` (carrying INTO gemini is gated\nuntil its current session-storage behavior is verified — gemini's own store\nmigration has been observed deleting legacy-format chats, so Constant refuses\nto guess).\n\nAll writes are atomic (temp file + rename): a crash mid-switch cannot leave a\ntorn session, and the previous projection always survives a failed write.\n\nOriginal source sessions are read as seeds and are not overwritten. Constant\nmaintains its own runtime projections for the carried thread, then keeps those\nprojections in sync as you switch back and forth.\n\nConstant redacts common secrets from carried text and strips runtime scaffold, but\nit still moves conversation content across a trust boundary. Do not use it on a\nsession if you are not comfortable with the target runtime reading that thread.\n\nF1 invariant: original runtime sessions are seeds, not targets. `host` and\n`carry` write or update Constant-owned projection sessions, then resume those\nprojections. They do not overwrite the original source session.\n\nCommand write behavior:\n\n- `constant doctor`: reads CLI/version/store presence only\n- `constant status`: reads runtime readiness, latest sessions, and the trail ledger\n- `constant trail` / `constant route` / `constant snapshots`: read the ledger\n- `constant sessions`: reads session metadata; `--titles` also reads transcripts\n- `constant carry --dry-run`: reads and distills, writes nothing\n- `constant carry`: writes a record snapshot + a target-native projection, updates the trail\n- `constant restore`: writes a fresh native projection from a record volume\n- `constant resume`: hosts an existing projection; writes only when you switch\n- `constant host`: writes only when you switch runtimes\n- `constant export`: writes only the requested `--out` file, or stdout\n\n## What Carries\n\nCarries:\n\n- user and assistant conversation turns\n- the working directory recorded by the source runtime\n- a Constant trail name so the carried session is recognizable in the target's\n  resume picker\n- with `--with-tools`: tool calls and results (redacted, size-capped)\n\nStripped on purpose:\n\n- runtime scaffold such as system prompts, injected environment blocks, skill\n  lists, plugin lists, and memory blocks\n- secrets: API keys, GitHub/Slack tokens, AWS access keys, private-key blocks,\n  JWTs, authorization headers, password/token assignments, and email addresses\n\nNot carried:\n\n- tool calls and tool results (unless `--with-tools`)\n- reasoning traces (never — model-internal)\n- hidden provider state\n- approvals, sandbox state, prompt cache state, or private runtime internals\n\nEvery carry prints a receipt of what was kept, dropped, and redacted — the\nlossiness is declared, never silent.\n\n## How It Works\n\n```text\n        ┌────────────────── constant host ──────────────────┐\n        │  real terminal                                    │\n        │    input -\u003e prefix interceptor -\u003e PTY -\u003e runtime   │\n        │    screen \u003c- child output  \u003c- PTY \u003c- runtime       │\n        │    [ status bar on a protected bottom row ]        │\n        └───────────────────────────────────────────────────┘\n\non switch:\n  source runtime session\n      -\u003e alembic reader (codex | claude | gemini | opencode)\n      -\u003e neutral thread model\n      -\u003e sanitize + redact            (receipt)\n      -\u003e record snapshot              (~/.constant/snapshots/…)\n      -\u003e target-native session writer (codex | claude | opencode)\n      -\u003e target runtime resume\n```\n\nThe distillation layer is named `alembic`. It is the part that knows how to load\neach runtime's session format, strip it down to the portable conversation, and\nmaterialize the target runtime's native session shape. Runtimes plug in as\ncodecs around the neutral model — N runtimes mean N codecs, not N² translators.\n\n## Commands\n\nPublic commands:\n\n```bash\nconstant host [codex|claude|opencode] [--prefix C-t] [--with-tools] [--no-bar]\nconstant resume [QUERY] [--in RT] [--list] [--all] [--prefix C-t] [--with-tools] [--no-bar]\nconstant carry --to codex|claude|opencode [--from RT | --session \u003cpath-or-id\u003e] [--json] [--dry-run] [--debug] [--new] [--with-tools]\nconstant sessions [--from RT] [--all] [--titles] [--json]\nconstant rename [--of HANDLE] NEW NAME...\nconstant pack HANDLE [--out FILE]\nconstant unpack FILE\nconstant ps [--json]\nconstant snapshots [--all]\nconstant restore \u003csnapshot\u003e [--to RT] [--json]\nconstant export (--from RT | --session \u003cpath-or-id\u003e) [--out FILE]\nconstant doctor [--json]\nconstant status [--all]\nconstant trail [--all] [--events]\nconstant route [--all] [--session \u003cpath-or-id\u003e]\nconstant --version\n```\n\nDebug and inspection commands:\n\n```bash\nconstant distill --from codex --to claude\nconstant keys\n```\n\n`constant distill` is the older name for `constant carry`; the internal cartridge\nstill calls this step distillation. `constant keys` prints raw key bytes for\ndebugging prefix behavior.\n\n## Supported Runtimes\n\nCurrent support:\n\n- Codex CLI: full (host, carry in/out, resume) — validated against `0.141.x`\n- Claude Code: full — validated against `2.1.x`\n- OpenCode: full — validated against `1.17.x`; reads via `opencode export`,\n  writes via `opencode import`, resumes via `opencode -s \u003cid\u003e`\n- Gemini CLI: carry **source** — validated against `0.40.x`; existing gemini\n  conversations load, list, and carry into the other runtimes\n\nThe session formats are private and can change between runtime releases. Constant\nhas round-trip tests for the current known shapes, but a runtime update can still\nrequire a codec refresh — and if one ever rejects Constant's sessions, the\nconversation reprints from its record snapshot.\n\nPlanned: carrying into Gemini; Aider.\n\n## When Not To Use Constant\n\nConstant is probably the wrong tool if:\n\n- you need a lossless transfer of reasoning traces or hidden runtime state\n- you do not want any writes into `~/.claude`, `~/.codex`, or the OpenCode store\n- your source runtime is still generating the current turn\n- your installed runtime version is outside the validated range\n- you want a multi-agent dashboard, model router, API proxy, or terminal\n  multiplexer\n\n## Development\n\nUseful checks:\n\n```bash\ncargo test\ncargo clippy --all-targets -- -D warnings\ncargo build --release\n```\n\nProject map:\n\n```text\nsrc/\n  main.rs              CLI entrypoint (carry, resume, restore, snapshots, …)\n  runtime.rs           runtime launch/resume commands\n  host.rs              PTY host, prefix handling, status bar, switch orchestration\n  trail.rs             Constant-owned lineage ledger + record snapshot paths\n  alembic/\n    mod.rs             distill, sanitize, redact, receipts, discovery, registry steps\n    ir.rs              neutral session model\n    sha256.rs          minimal SHA-256 (gemini keys its store by sha256(cwd))\n    formats/\n      claude.rs        Claude session reader/writer\n      codex.rs         Codex rollout reader/writer\n      gemini.rs        Gemini session reader (carry source)\n      opencode.rs      OpenCode export-shape reader/writer (import/export based)\n```\n\nThe low-level Codex/Claude session codecs and the neutral IR are\nvendored from [transession](https://github.com/inmzhang/transession) (MIT; see\n`src/alembic/LICENSE.transession`). Constant adds the sanitize/redact pass,\nnative-resume hardening, stable runtime projections, the record, trail naming,\nthe Gemini and OpenCode codecs, and the live host.\n\n## License\n\nMIT.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkennykankush%2Fconstant","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkennykankush%2Fconstant","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkennykankush%2Fconstant/lists"}