{"id":50985895,"url":"https://github.com/tam159/next-role","last_synced_at":"2026-07-07T16:00:40.709Z","repository":{"id":354331326,"uuid":"1223169069","full_name":"tam159/next-role","owner":"tam159","description":"🚀 Level up your career with GenAI. 📄 Tailor your CV to any JD, 🔍 automate company research, and 🗓️ generate custom interview prep plans for your next role or internal promotion.","archived":false,"fork":false,"pushed_at":"2026-07-03T05:15:57.000Z","size":17416,"stargazers_count":24,"open_issues_count":13,"forks_count":6,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-07-03T07:15:47.059Z","etag":null,"topics":["a2a","ai-agents","ai-long-term-memory","career","context-engineering","deepagents","gen-ai","harness-engineering","langgraph","llm","mcp","multi-agent","resume-builder"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/tam159.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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-04-28T04:23:17.000Z","updated_at":"2026-07-03T02:27:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tam159/next-role","commit_stats":null,"previous_names":["tam159/next-role"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/tam159/next-role","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tam159%2Fnext-role","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tam159%2Fnext-role/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tam159%2Fnext-role/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tam159%2Fnext-role/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tam159","download_url":"https://codeload.github.com/tam159/next-role/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tam159%2Fnext-role/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35234127,"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-07-07T02:00:07.222Z","response_time":90,"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":["a2a","ai-agents","ai-long-term-memory","career","context-engineering","deepagents","gen-ai","harness-engineering","langgraph","llm","mcp","multi-agent","resume-builder"],"created_at":"2026-06-19T19:00:19.261Z","updated_at":"2026-07-07T16:00:40.691Z","avatar_url":"https://github.com/tam159.png","language":"TypeScript","funding_links":[],"categories":["Applications"],"sub_categories":["Multi-Agent Task Solver Projects"],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003ca href=\"https://github.com/tam159/next-role\" target=\"_blank\"\u003e\n  \u003cpicture\u003e\n    \u003cimg alt=\"NextRole\" src=\"docs/images/next-role-logo-transparent.png\" width=\"180\" height=\"180\"\u003e\n  \u003c/picture\u003e\n\u003c/a\u003e\n\n# NextRole 🚀\n\n### ✨ GenAI-Accelerated Career Advancement ✨\n\n**Upload your CV + a job description. Get a tailored resume PDF, a researched interview-prep doc, and a day-of battlecard cheat sheet — built by a multi-agent system with long-term memory.**\n\n\u003c!-- Row 1 · project --\u003e\n\n![Python](https://img.shields.io/badge/Python-3.13-3776AB?logo=python\u0026logoColor=white)\n![Next.js](https://img.shields.io/badge/Next.js-16-000000?logo=nextdotjs\u0026logoColor=white)\n![React](https://img.shields.io/badge/React-19-61DAFB?logo=react\u0026logoColor=black)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)\n[![GitHub stars](https://img.shields.io/github/stars/tam159/next-role?style=social)](https://github.com/tam159/next-role/stargazers)\n\n\u003c!-- Row 2 · AI stack --\u003e\n\n![LangChain](https://img.shields.io/badge/LangChain-v1-1C3C3C?logo=langchain\u0026logoColor=white)\n![LangGraph](https://img.shields.io/badge/LangGraph-1.x-FF6F61)\n![DeepAgents](https://img.shields.io/badge/DeepAgents-0.6-6E56CF)\n![LangSmith](https://img.shields.io/badge/Observability-LangSmith-FF6F61)\n![Exposes MCP + A2A](https://img.shields.io/badge/exposes-MCP%20%2B%20A2A-0A7EA4)\n\n\u003cbr/\u003e\n\n\u003cimg alt=\"NextRole start page — chat-driven prep on the left, a live artifact workspace on the right\" src=\"docs/images/next-role-hero-image.png\" width=\"100%\"\u003e\n\n\u003c/div\u003e\n\n---\n\n## What is NextRole?\n\nPreparing for an interview takes hours of tedious resume tailoring and company research. **NextRole automates the heavy lifting.** Hand it your current CV and a target Job Description (or just a JD URL) — whether you're applying externally or angling for an internal move — and a team of specialized AI agents researches the company, rewrites your resume to fit, coaches you round-by-round, and prints a cheat sheet for the day of.\n\n- 📄 **Tailored resume → PDF** — your experience rewritten against the exact JD + company research, rendered with [`rendercv`](https://github.com/rendercv/rendercv) (editable \u0026 re-renderable).\n- 🔍 **Deep company \u0026 role recon** — live web research distilled into a match analysis.\n- 🎯 **Structured interview prep** — a self-introduction plus per-round STAR stories mapped to the role.\n- ⚡ **Day-of battlecard** — a one-page-per-round PDF cheat sheet for the final high-pressure review.\n- 🗓️ **Time-boxed prep plans** — a study plan that fits 1 month, 2 weeks, or just 3 hours.\n- 🔗 **Paste a JD URL** — point it at a careers page; it extracts and processes the posting for you.\n- 💬 **Iterate by chatting** — \"add a 4th round\", \"add React to my skills\" — streaming multi-turn edits, with the right agent owning each file.\n- 🗂️ **Built-in workspace** — upload, preview (PDF / MD / YAML / JSON / code), print-to-PDF, and swap the LLM at runtime.\n\n## Demo\n\n\u003cvideo src=\"https://github.com/user-attachments/assets/cc0386d8-c66f-4f72-a7c8-89ea80d0b3e5\" width=\"100%\" controls\u003e\n  Your browser does not support the video tag.\n\u003c/video\u003e\n\n▶️ **[Watch the full walkthrough in HD on YouTube »](https://youtu.be/7RzDYpmfOyA)**\n\n## Quick Start\n\nThe whole stack — frontend, backend, Postgres, Redis — runs in Docker.\n\n```bash\n# 1. Clone \u0026 configure\ngit clone https://github.com/tam159/next-role.git\ncd next-role\ncp .env.example .env          # then fill in your API keys (see table below)\n\n# 2. Launch everything\ndocker compose up -d\n\n# 3. Find your host ports (set in .env, vary per machine)\ndocker ps                     # read the 0.0.0.0:\u003chost\u003e-\u003e... mappings\n\n# 4. Open the app\n#    Frontend UI      →  http://localhost:\u003cFRONTEND_LOCAL_PORT\u003e/\n#    Backend API docs →  http://localhost:\u003cLANGGRAPH_LOCAL_PORT\u003e/docs\n```\n\n\u003e 💡 **Pick your LLM in the app.** Open the in-app **Configuration** dialog to set the main agent and subagent models — no rebuild needed. See **LLM configuration** below for recommended models and free / local options.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eEnvironment variables\u003c/b\u003e — what to put in \u003ccode\u003e.env\u003c/code\u003e\u003c/summary\u003e\n\n\u003cbr/\u003e\n\n| Variable | Required | Purpose |\n| --- | :---: | --- |\n| `OPENAI_API_KEY` | ✅ | Default main + subagent models |\n| `TAVILY_API_KEY` | ✅ | Web research (`hiring-recon`) |\n| `LLAMA_CLOUD_API_KEY` | ✅ | Document parsing (LlamaParse) |\n| `POSTGRES_PASSWORD` | ✅ | Local Postgres password |\n| `ANTHROPIC_API_KEY` / `GOOGLE_API_KEY` | ⬜ | Alternative providers (swap at runtime) |\n| `OPENAI_API_BASE` | ⬜ | Self-hosted / Azure / LM Studio endpoint |\n| `AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY` / `AWS_DEFAULT_REGION` | ⬜ | AWS Bedrock models |\n| `LANGCHAIN_API_KEY` + `LANGCHAIN_TRACING_V2=true` | ⬜ | LangSmith tracing (recommended) |\n| `FRONTEND_LOCAL_PORT` / `LANGGRAPH_LOCAL_PORT` / `POSTGRES_LOCAL_PORT` / `REDIS_LOCAL_PORT` | preset | Host port mappings |\n\nSecrets live only in `.env` (gitignored); `gitleaks` runs on every commit.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eLLM configuration\u003c/b\u003e — pick your models, run it for free or local\u003c/summary\u003e\n\n\u003cbr/\u003e\n\nModels are swappable **at runtime** — no rebuild. Open the in-app **Configuration** dialog and set **Main agent** / **Subagents** to a `\u003cprovider\u003e:\u003cmodel\u003e` string (e.g. `anthropic:claude-sonnet-4.6`); leave blank to use the defaults. Settings persist in your browser's local storage.\n\n**Recommended:** Claude Sonnet 4.x, GPT-5.x, or Gemini 3.x — e.g. `anthropic:claude-sonnet-4.6`, `openai:gpt-5.4`, `google_genai:gemini-3.5-flash`.\n\n**Run it for free or fully local:**\n\n- **Tavily** and **LlamaCloud** both include a generous monthly free tier — plenty for local use.\n- **Google AI Studio** offers a free tier for Gemini `flash` / `lite` models.\n- **Fully local** — point `OPENAI_API_BASE` at [LM Studio](https://lmstudio.ai/) or [Ollama](https://ollama.com/) (both expose an OpenAI-compatible API) and fill your local model in the UI.\n\nOutput quality tracks the model you pick — smaller local models trade some quality for zero cost.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eDev workflow\u003c/b\u003e — hot reload, restart, rebuild, stop\u003c/summary\u003e\n\n\u003cbr/\u003e\n\n- **Code edits** hot-reload in both containers — just save the file.\n- **Add a frontend dep:** `pnpm --dir frontend add \u003cpkg\u003e` → `docker compose restart frontend`\n- **Add a backend dep:** `uv add \u003cpkg\u003e` → `docker compose up -d --build backend`\n- **Change `.env`:** `docker compose restart \u003cservice\u003e`\n- **Stop:** `docker compose down` (add `-v` to wipe the DB \u0026 Redis volumes)\n\n\u003c/details\u003e\n\n## Architecture\n\nNextRole is a **supervisor agent orchestrating three specialist subagents** on LangGraph + DeepAgents. The main agent handles intake, document processing, and the final battlecard; it delegates research, resume tailoring, and interview coaching to declarative subagents (defined in `subagents.yaml`, each with its own model, tools, and skills).\n\n![NextRole architecture](docs/images/next-role-architecture.png)\n\n## How It Works\n\nA five-stage pipeline. Stage 4 runs the resume tailor and interview coach **in parallel**; Stage 6 routes follow-up edits to whichever agent owns the target file.\n\n![How NextRole works](docs/images/how-next-role-works.png)\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eStage-by-stage detail\u003c/b\u003e\u003c/summary\u003e\n\n\u003cbr/\u003e\n\n1. **Intake** — the agent asks for your CV, the JD (file, URL, or pasted text), your prep timeline, and any extra context.\n2. **Process documents** — uploads are parsed to markdown via LlamaParse (`parse_document`); JD URLs are pulled via Tavily (`extract_jd`). Results land in `/processed/`, alongside a persisted intake note.\n3. **Research** — the `hiring-recon` subagent gathers company + role intel and a match analysis → `/research/\u003cresume\u003e/\u003cjd\u003e.md`.\n4. **Tailor \u0026 coach (parallel)** — `resume-tailor` rewrites the CV as a `rendercv` YAML and renders a PDF; `interview-coach` writes a structured prep doc (self-intro + per-round STAR stories).\n5. **Battlecard** — the main agent assembles a one-page-per-round JSON and renders it to a day-of PDF via WeasyPrint.\n6. **Multi-turn updates** — ask for changes in chat; the owning agent reads the existing file, preserves everything you didn't name, and re-renders.\n\nThe full procedure (file layout, update routing, source-of-truth conventions) lives in **[`backend/agents/career_agent/README.md`](backend/agents/career_agent/README.md)**. Per-feature design docs are in **[`docs/prd/`](docs/prd/)**.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eThe DeepAgents stack\u003c/b\u003e — an agent defined by filesystem primitives\u003c/summary\u003e\n\n\u003cbr/\u003e\n\nThe agent's behavior is configured by files, not hardcoded — making it easy to read, diff, and extend:\n\n| Primitive | Where | Role | When loaded |\n| --- | --- | --- | --- |\n| **Memory** | `AGENTS.md` | Per-stage procedure manual (semantic memory) | Always (system prompt) |\n| **Skills** | `skills/\u003cconsumer\u003e/\u003cname\u003e/SKILL.md` | Task workflows (procedural memory) | On demand, per consumer |\n| **Subagents** | `subagents.yaml` | Specialist delegates → the `task` tool | Always |\n| **Tools** | `tools.py` + DeepAgents built-ins | `parse_document`, `extract_jd`, `render_battlecard_pdf`, `prepare_render_settings`, `list_files`, `overwrite_file`, plus `read/write/edit_file`, `ls/glob/grep`, `execute` | — |\n| **Filesystem** | `CompositeBackend` | Routes virtual paths to the right store (see below) | — |\n| **Middleware** | `middleware.py` | `ModelOverrideMiddleware` (runtime LLM swap) + `UtcDatetimeMiddleware` | — |\n\nSubagents only receive the tools they opt into in YAML — tool whitelisting keeps `interview-coach`, for example, from inheriting the main agent's full toolset.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eMemory \u0026amp; storage architecture\u003c/b\u003e\u003c/summary\u003e\n\n\u003cbr/\u003e\n\nA single `CompositeBackend` gives the agent one virtual filesystem while routing each path prefix to the right physical store — Postgres for text artifacts, disk for binaries and render outputs, and a shell backend that translates virtual paths to real ones before running commands like `rendercv render`.\n\n```mermaid\nflowchart LR\n    Agent[\"Agent filesystem tools\u003cbr/\u003eread_file · write_file · edit_file\u003cbr/\u003els · glob · grep · execute\"]\n    CB{{\"CompositeBackend\u003cbr/\u003eroutes virtual paths\"}}\n    Agent --\u003e CB\n    subgraph Shell[\"VirtualPathShellBackend · default route\"]\n        SH[\"rewrites /virtual/path → on-disk path\u003cbr/\u003ebefore subprocess.run\u003cbr/\u003e(e.g. rendercv render /tailored_resume/...)\"]\n    end\n    subgraph Store[\"StoreBackend · Postgres + pgvector\"]\n        ST[\"/memory/ · /processed/ · /research/\u003cbr/\u003e/interview_coach/\u003cbr/\u003e/large_tool_results/ · /workspace/\"]\n    end\n    subgraph Disk[\"FilesystemBackend · disk (binaries + renders)\"]\n        DK[\"/upload/ · /tailored_resume/\u003cbr/\u003e/render_intermediate/\u003cbr/\u003e/interview_battlecard/\"]\n    end\n    CB --\u003e|default| Shell\n    CB --\u003e|KV routes| Store\n    CB --\u003e|binary + PDF routes| Disk\n    Sem[\"Semantic memory · AGENTS.md\"] -. loaded into system prompt .-\u003e Agent\n    Proc[\"Procedural memory · skills/*/SKILL.md\"] -. loaded on demand .-\u003e Agent\n    Work[\"Working memory · LangGraph thread\"] -. drives .-\u003e Agent\n    Store --- Epi[\"Episodic memory · persisted artifacts\u003cbr/\u003e(incl. /memory/ auto-memory)\"]\n    Disk --- Epi\n```\n\nMapped to memory types:\n\n- **Working memory** — the live LangGraph conversation thread.\n- **Semantic memory** — `AGENTS.md`, always in the system prompt.\n- **Procedural memory** — `skills/*/SKILL.md`, loaded on demand.\n- **Episodic memory** — persisted artifacts in Postgres + disk, including *auto-memory*: standing preferences saved to the `/memory/` route and auto-applied across sessions.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eTech stack\u003c/b\u003e\u003c/summary\u003e\n\n\u003cbr/\u003e\n\n| Layer | Stack |\n| --- | --- |\n| **Backend** | Python 3.13 · LangChain v1 · LangGraph 1.x · DeepAgents 0.6 · `uv` · served by NextRole's own self-hosted agent server ([`backend/ARCHITECTURE.md`](backend/ARCHITECTURE.md)) |\n| **Agent I/O** | Tavily (web search) · LlamaParse / LlamaCloud (document parsing) · `rendercv` (resume → PDF) · WeasyPrint (battlecard → PDF) |\n| **Frontend** | Next.js 16 · React 19 · TypeScript · Tailwind · `pnpm` · `@langchain/react` (v2 `useStream`) |\n| **Data** | PostgreSQL 18 + pgvector · Redis 8 |\n| **Infra** | Docker Compose (frontend · backend · core-server · postgres · redis) |\n| **Observability** | LangSmith |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eExpose the agent\u003c/b\u003e — MCP \u0026amp; A2A\u003c/summary\u003e\n\n\u003cbr/\u003e\n\nBecause NextRole ships its own **agent server** implementing the LangGraph Server API (see [`backend/ARCHITECTURE.md`](backend/ARCHITECTURE.md)), the `career_agent` assistant is also reachable by other tools and agents — no extra code:\n\n- **MCP** — exposed as Model Context Protocol tools at **`/mcp`** (Streamable HTTP), usable by any MCP-compliant client. → [docs](https://docs.langchain.com/langsmith/server-mcp)\n- **A2A** — Google's Agent2Agent protocol at **`/a2a/{assistant_id}`** (JSON-RPC 2.0; `message/send` + `message/stream`). → [docs](https://docs.langchain.com/langsmith/server-a2a)\n- The full server API is browsable at the **`/docs`** endpoint of your deployment.\n\n![NextRole Agent Expose](docs/images/next-role-agent-expose.png)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eObservability\u003c/b\u003e — LangSmith tracing\u003c/summary\u003e\n\n\u003cbr/\u003e\n\nSet `LANGCHAIN_API_KEY` and `LANGCHAIN_TRACING_V2=true` in `.env`, and every run — each LLM call, tool call, and nested subagent — is traced at [smith.langchain.com](https://smith.langchain.com/) under the `LANGCHAIN_PROJECT` you configure. Optional, but invaluable for debugging the multi-agent flow.\n\n\u003c/details\u003e\n\n## Roadmap\n\n- 💤 **\"Auto-dream\" consolidation** — sleep-time compaction that prunes stale notes and merges insights into durable memory.\n- 📦 **Remote sandboxes** — swap `LocalShellBackend` for an isolated remote sandbox (e.g. [Daytona](https://www.daytona.io/)) so render/shell steps are safe for multi-tenant use.\n- 📊 **Agent evaluation** — LangSmith evals over the workflow (the `@pytest.mark.eval` marker is already reserved).\n- 🎨 **Enhanced UI** — richer artifact editing, diff views, and inline regeneration.\n- 🔌 **MCP / A2A examples** — sample integrations driving `career_agent` from external agents and IDEs.\n- 🧵 **Per-thread / multi-user scoping** — namespace artifacts per user instead of the current global layout.\n- 🌐 **More sources \u0026 ATS-aware tailoring** — pluggable retrievers + keyword/ATS optimization passes.\n\n## Limitations\n\n\u003e NextRole is built for **local, single-user, trusted use** today.\n\n- 🔒 **Local shell execution** — `VirtualPathShellBackend` runs render commands via `subprocess` on the host. Safe locally; **not** hardened for multi-tenant production (needs sandboxing — see roadmap).\n- 👤 **Global file scoping** — uploads and artifacts share one filesystem layout; re-uploading a filename overwrites. No per-user isolation yet.\n- 🧪 **LLM evals deferred** — current tests are unit + local-DB integration; automated quality evals aren't wired up yet.\n- 🧠 **Personalization is preferences-only** — the agent persists and auto-applies the preferences you *state* across sessions, but doesn't yet infer your style/history on its own or consolidate memory over time (see [roadmap](#roadmap)).\n- ⏱️ **Latency** — a full run makes several LLM and tool calls across multiple agents; expect minutes, not seconds.\n\n## Contributing\n\nPRs and issues are welcome! Start with **[`CONTRIBUTING.md`](CONTRIBUTING.md)** — it walks through the fork → PR workflow, local setup, the CI quality gate (code quality + backend tests + frontend tests), testing, and conventions. Stack-specific details live in [`backend/CLAUDE.md`](backend/CLAUDE.md) and [`frontend/CLAUDE.md`](frontend/CLAUDE.md); commits follow [Conventional Commits](https://www.conventionalcommits.org/).\n\nNew here? Issues labelled [`good first issue`](https://github.com/tam159/next-role/labels/good%20first%20issue) are a gentle place to start, and questions are welcome in [Discussions](https://github.com/tam159/next-role/discussions).\n\n## License\n\n[MIT](LICENSE) © 2026 Tam Nguyen\n\n## Acknowledgements\n\nBuilt on [DeepAgents](https://github.com/langchain-ai/deepagents), [LangChain / LangGraph / LangSmith](https://github.com/langchain-ai), [rendercv](https://github.com/rendercv/rendercv), [WeasyPrint](https://github.com/Kozea/WeasyPrint), [Tavily](https://tavily.com/), and [LlamaIndex / LlamaParse](https://github.com/run-llama/llama_index).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftam159%2Fnext-role","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftam159%2Fnext-role","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftam159%2Fnext-role/lists"}