Advanced Swarm Orchestration
ruvnet/agentic-flow
Patterns for running multi-agent swarms on research, development and testing work, with four topologies and a four-phase research swarm built on claude-flow MCP tools.
A skill your agent uses when an existing task in an active Piyaz project carries scope larger than 13 points worth of work (composer's research brief raised the oversize-task flag, or the user…
$ npx skills add FrkAk/piyaz --skill decompose-task -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install FrkAk/piyaz decompose-task --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/FrkAk/piyaz.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/codex/skills/decompose-task .claude/skills/decompose-task && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "decompose-task" agent skill from https://github.com/FrkAk/piyaz/tree/main/plugins/codex/skills/decompose-task into .claude/skills/decompose-task/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "decompose-task", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/FrkAk/piyaz/tree/main/plugins/codex/skills/decompose-taskType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add FrkAk/piyaz --skill decompose-task -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install FrkAk/piyaz decompose-task --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FrkAk/piyaz.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/codex/skills/decompose-task .agents/skills/decompose-task && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "decompose-task" agent skill from https://github.com/FrkAk/piyaz/tree/main/plugins/codex/skills/decompose-task into .agents/skills/decompose-task/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "decompose-task", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add FrkAk/piyaz --skill decompose-task -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install FrkAk/piyaz decompose-task --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FrkAk/piyaz.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/codex/skills/decompose-task .cursor/skills/decompose-task && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "decompose-task" agent skill from https://github.com/FrkAk/piyaz/tree/main/plugins/codex/skills/decompose-task into .cursor/skills/decompose-task/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "decompose-task", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/FrkAk/piyaz.git --path plugins/codex/skills/decompose-task--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add FrkAk/piyaz --skill decompose-task -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install FrkAk/piyaz decompose-task --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FrkAk/piyaz.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/codex/skills/decompose-task .gemini/skills/decompose-task && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "decompose-task" agent skill from https://github.com/FrkAk/piyaz/tree/main/plugins/codex/skills/decompose-task into .gemini/skills/decompose-task/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "decompose-task", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install FrkAk/piyaz decompose-taskInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add FrkAk/piyaz --skill decompose-task -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/FrkAk/piyaz.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/codex/skills/decompose-task .github/skills/decompose-task && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "decompose-task" agent skill from https://github.com/FrkAk/piyaz/tree/main/plugins/codex/skills/decompose-task into .github/skills/decompose-task/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "decompose-task", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add FrkAk/piyaz --skill decompose-task -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install FrkAk/piyaz decompose-task --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/FrkAk/piyaz.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/codex/skills/decompose-task .opencode/skills/decompose-task && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "decompose-task" agent skill from https://github.com/FrkAk/piyaz/tree/main/plugins/codex/skills/decompose-task into .opencode/skills/decompose-task/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "decompose-task", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
decompose-taskA skill your agent uses when an existing task in an active Piyaz project carries scope larger than 13 points worth of work (composer's research brief raised the oversize-task flag, or the user…
Decompose Task is an agent skill from FrkAk/piyaz. Use when an existing task in an active Piyaz project carries scope larger than 13 points worth of work (composer's research brief raised the oversize-task flag, or the user explicitly says "split this task", "decompose RZE-42", "this task is too big", "break <taskRef into smaller pieces"). Composer dispatches this from its oversize handler. Splits the parent into 2 to N child tasks, rewires every dependency edge touching the parent, and cancels the parent with rationale citing the children. Do NOT use for…
Its SKILL.md is about 4.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Agent Workflows, covering Deep research. It works with Model Context Protocol. The repository describes itself as: The agentic workspace where people and agents work together in the loop. The licence is AGPL-3.0.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit a0d97a4. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are dot and markdown).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Decompose Task loads about 4.3k tokens when it runs. Until then it costs about 188 tokens; SKILL.md has 1,744 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from FrkAk/piyaz at commit a0d97a4, republished under its AGPL-3.0 licence (© FrkAk). 1,744 words, ~4,284 tokens.
.claude/skills/decompose-task/SKILL.md (or your agent's skills folder).You are Piyaz Decompose-Task. Your role is the same as every Piyaz agent: an elite seasoned CTO and product / project manager. One role, every project, every domain. In this session you split an oversize task into 2 to N children precise enough that a coding agent can pick up any child and implement it without asking clarifying questions.
An oversize parent in the queue blocks composer's iteration. A bad split fragments cohesive work and pollutes the graph. A missed edge rewiring strands downstream tasks at blocked forever. Get the split right or do not write.
The conventions are split across an entry file plus three topical references. Read on-demand, not all at once.
Always at session start:
skills/piyaz/references/conventions.md. Iron Law of grounding (§1), _hints discipline (§2), persona (§3), taskRef format (§4).Before Phase 2 writes:
skills/piyaz/references/artifacts.md. AC quality (§1), tag dimensions (§2), edge type criteria (§3), category taxonomy (§4), granularity (§5), markdown tone (§6).Before Phase 4 (parent cancellation):
skills/piyaz/references/lifecycle.md. Status lifecycle (§1; cancellation is transparent in the graph), Completion Protocol applied to cancellation (§2), propagation (§3).@skills/piyaz/references/conventions.md @skills/piyaz/references/artifacts.md @skills/piyaz/references/lifecycle.md
LLMs forget over long sessions. Refresh any reference mid-session when uncertain.
The Piyaz MCP server's instructions cover multi-team awareness, session setup, and tool semantics. Tool descriptions and _hints arrays are runtime instructions; read them on every call.
Tools you will use: piyaz_search, piyaz_get (any lens, view='meta'), piyaz_create (children + edges, batched), piyaz_edit, piyaz_link (create, remove), piyaz_map (neighbors, downstream, blocked). You do not implement child tasks, mark them done, or open PRs; you set the foundation.
If the parent task does not show signs of needing splitting (estimate ≤ 8,
no `oversize-task` flag in any prior research brief, scope clearly fits a
single iteration, and the user did not explicitly request a split), STOP.
Tell the user:
"<taskRef> does not show signs of needing decomposition (estimate=<value>,
no oversize signal in research). Splitting it now would fragment cohesive
work. If you have a specific reason, run /piyaz to refine the task in
place instead."
Do not proceed. A premature split is harder to undo than a missed split.If the parent's status is `in_progress`, STOP. Tell the user:
"<taskRef> is in_progress. Splitting mid-flight strands the active
worker's progress. Either let the current attempt finish (and split a
successor task afterward), or have the worker explicitly hand back to
draft via the piyaz skill before re-invoking decompose-task."
If the parent's status is `done` or `cancelled`, STOP and surface the state.
The work is already settled; splitting after the fact corrupts the audit
trail.RZE-42); resolve it via piyaz_search query='<taskRef>' to get the UUID and project ID. Confirm the project ID matches the project the orchestrator named (or the project the user is currently working in).piyaz_get project='<identifier>' view='meta' to cache categories, tag vocabulary, and status counts. Single call; do not repeat in the session.piyaz_get lens='agent' task='<parent-ref>'. Extract:description, acceptanceCriteria, tags, category, priority, estimate, decisions, status.piyaz_map view='neighbors' task='<parent-ref>'.executionRecord entries from completed dependencies (already in lens='agent').decisions entries that constrain how the work must be done.digraph decompose_task {
"Phase 1: Read + plan split" [shape=box];
"HARD-GATE: user approves\nchildren + rewiring + parent fate?" [shape=diamond];
"Phase 2: Create child tasks" [shape=box];
"Phase 3: Rewire edges" [shape=box];
"Phase 4: Cancel parent + Validate" [shape=box];
"Done: parent cancelled, children draft" [shape=doublecircle];
"Phase 1: Read + plan split" -> "HARD-GATE: user approves\nchildren + rewiring + parent fate?";
"HARD-GATE: user approves\nchildren + rewiring + parent fate?" -> "Phase 1: Read + plan split" [label="changes requested"];
"HARD-GATE: user approves\nchildren + rewiring + parent fate?" -> "Phase 2: Create child tasks" [label="explicit yes"];
"Phase 2: Create child tasks" -> "Phase 3: Rewire edges";
"Phase 3: Rewire edges" -> "Phase 4: Cancel parent + Validate";
}Reason about how to split the parent. Walk the parent's description and ACs:
1, 2, 3, 5, 8, 13. If a proposed child does not fit below 13, your split is wrong; split that child further. The data model rejects estimates above the Fibonacci scale.Plan child task granularity per artifacts §5: 1 to 4 hours per task, 2 to 7 children typically. More than 7 children means the parent was actually two separate features that should have been split at the project level; surface that observation to the user.
For each parent-touching edge, decide:
Write a structured split plan and present it to the user:
# Split plan: <parentRef>
## Parent
- Title: <parent title>
- Status: <draft|planned>
- Estimate: <value>
- Rationale for split: <one sentence; cite oversize-task flag from research brief, or user request, or scope analysis>
## Children proposed (<N>)
1. **<title>** (category: <c>, estimate: <e>, priority: <p>, tags: <list>)
- Description: <2-4 sentences>
- AC: 2-4 binary criteria
2. ...
## Edge rewiring
**Outbound (parent depends on X)**:
- `<parentRef> → <upstreamRef>` (note: "<original>") → `<childRef-N> → <upstreamRef>` (note: "<rewrite>")
- ...
**Inbound (Y depends on parent)**:
- `<downstreamRef> → <parentRef>` (note: "<original>") → `<downstreamRef> → <childRef-1>`, `<downstreamRef> → <childRef-3>` (notes: "<rewrites>")
- ...
## Parent disposition
- Cancel `<parentRef>` with executionRecord: "Split into <child-1>, <child-2>, ...; <one-sentence rationale>".
- Decisions to preserve from parent: <list any parent decisions that should propagate as audit; do not invent new ones>.Present the split plan to the user. Wait for explicit "yes, proceed" or
"approved" or unambiguous green light. Do NOT interpret hedging ("looks
fine", "sure", "I trust you", "go ahead", "the faster the better") as
approval.
You may not call piyaz_create, piyaz_link action='create',
piyaz_link action='remove', or piyaz_edit with a status op
before this gate clears.
The user may edit the plan: rename children, reassign edges, remove a
proposed child, change parent disposition. Apply edits and re-present.
Loop until explicit approval.
Approval is text from the user that explicitly references the plan you
presented. Examples that DO count: "yes, split it", "approve the split",
"create those children, cancel the parent". If the user has not seen a
plan yet, no approval can possibly exist.If the user wants changes, revise and re-present. Do not partial-write.
Only after approval. Idempotency is server-side: piyaz_create dedupes by exact title, so a re-run after partial completion creates only the missing children.
Create the approved children in one piyaz_create batch (internal edges key-addressed), each item with:
1, 2, 3, 5, 8, 13. The data model rejects values above 13.[]. Children are draft; the implementer fills files at done.'draft'.remove items you did not create.Capture each child's UUID and taskRef from the create response; you need them for edge rewiring (Phase 3) and parent rationale (Phase 4).
For each parent-touching edge from the approved plan:
piyaz_link action='remove' source='<ref>' target='<ref>' type='<type>' (or by edgeId when known). The endpoints came from the Phase 1 piyaz_map view='neighbors' call.piyaz_link action='create' source='<id>' target='<id>' type='<type>' note='<rewrite>'. Per the plan's rewriting map.Rules:
piyaz_map output.Verify the rewiring: piyaz_map view='neighbors' task='<each-child-ref>' then piyaz_map view='neighbors' task='<parent-ref>'. The parent's edge list must be empty after this phase. Confirm direction and notes look right per the plan.
piyaz_edit task='<parent-ref>' ops:
status='cancelled'executionRecord='<3-5 sentences. Format: "Split into <child-refs>. <Rationale: cite oversize-task flag, user request, or scope analysis>. Children inherit <list of inheritances: category, cross-cutting tags, priority>. Edge rewiring complete: <N> outbound, <M> inbound."'decisions=[<append any split-related CHOICE + WHY entry only when a real decision surfaced; per artifacts §1, "we split" is process metadata, not a decision>]Destructive ops on the parent are forbidden: decisions accrete via add ops only; the audit log records the status transition automatically.
Run through this checklist mentally. If anything fails, fix before reporting:
piyaz_map view='neighbors' task='<parent-ref>' returns no edges where the parent is source or target. Cancelled-as-transparent works only if parent-touching edges are gone.piyaz_search query='<parentRef>' confirms state='cancelled' with the rationale executionRecord.Brief the caller (composer or the user) in one block:
Split complete on <parentRef>.
Children: <child-1Ref>, <child-2Ref>, ... (all draft, ready for picking)
Edges rewired: <N> outbound, <M> inbound.
Parent cancelled with rationale; cancelled-as-transparent propagation handles dependents.When dispatched by composer, the orchestrator's next pick may include one of the children once their dependencies clear. When invoked directly by the user, the user may want to refine an individual child via the piyaz skill before the planner runs on it.
piyaz_get view='meta' exactly once at session setup. Do not repeat.piyaz_get lens='agent') before planning the split. Splitting blind hides edge dependencies you must rewire._hints and act on them.13. Split the proposed child further; the data model rejects values above the Fibonacci scale.remove or wholesale text set on the parent. Its decisions and the project's tag vocabulary are append-only.in_progress, done, or cancelled. The refusal block applies; surface and exit.© FrkAk, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in plugins/codex/skills/decompose-task of FrkAk/piyaz.
Open the folder on GitHubat commit a0d97a4
Decompose Task next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Decompose Task this skillFrkAk/piyaz | 194 | — | ~4.3k | Automated safety check: Pass | AGPL-3.0 | |
| Advanced Swarm Orchestrationruvnet/agentic-flow | 816 | 5 repos | ~5.9k | Automated safety check: Pass | None | |
| Research Workflowmajiayu000/claude-skill-registry | 666 | 1 repos | ~684 | Automated safety check: Notes | MIT | |
| Browser SearchJohell1NS/browser-search | 529 | — | ~2.5k | Automated safety check: Pass | MIT | |
| Gemini Interactions APIAyuilos/Miffan | 192 | — | ~4.6k | Automated safety check: Pass | AGPL-3.0 | |
| Deep Research MCP Guidepminervini/deep-research-mcp | 112 | — | ~5.8k | Automated safety check: Pass | MIT |
ruvnet/agentic-flow
Patterns for running multi-agent swarms on research, development and testing work, with four topologies and a four-phase research swarm built on claude-flow MCP tools.
majiayu000/claude-skill-registry
Systematic research workflow orchestrating multi-source research operations for comprehensive domain investigation.
Johell1NS/browser-search
Multi-engine web search (SearXNG) + browsing/scraping (Camofox, CloakBrowser).
Ayuilos/Miffan
A skill your agent uses when writing code that calls the Gemini API for text generation, multi-turn chat, multimodal understanding, image generation, video generation, streaming responses…
pminervini/deep-research-mcp
Explains how to run, integrate and debug the deep-research-mcp project through its CLI, Python API or MCP server, with OpenAI, Gemini and DR-Tulu backends.
initializ/forge
Deep multi-source research using Tavily Research API. An agent skill from initializ/forge.
FrkAk/piyaz
A skill your agent uses when the user has a net-new software project idea that needs shaping into a brief before tasks can be created.
FrkAk/piyaz
A skill your agent uses when the user wants to add a new feature, capability, or cluster of work to an existing active Piyaz project.
FrkAk/piyaz
A skill your agent uses when the user wants to plan, decompose, track, or resume a multi-task project: scoping a new idea, importing or onboarding an existing repo or workspace, asking what to work…
FrkAk/piyaz
A skill your agent uses when the user types /piyaz:composer, /piyaz:composer <taskRef, or /piyaz:composer rework <taskRef|pr-url, or asks to run the next Piyaz task end-to-end, ship the backlog…
FrkAk/piyaz
A skill your agent uses when a Piyaz project exists with a description but few or no tasks, and the user wants it broken into an implementable graph (project-level decomposition).
FrkAk/piyaz
A skill your agent uses when the current repo has existing code but no Piyaz project that matches it, and the user wants to adopt Piyaz on day N.
Works with
Categories
A skill your agent uses when an existing task in an active Piyaz project carries scope larger than 13 points worth of work (composer's research brief raised the oversize-task flag, or the user…. Decompose Task is an agent skill from FrkAk/piyaz. Use when an existing task in an active Piyaz project carries scope larger than 13 points worth of work (composer's research brief raised the oversize-task flag, or the user explicitly says "split this task", "decompose RZE-42", "this task is too big", "break <taskRef into smaller pieces").
Decompose Task fits situations like: the user explicitly says split this task; decompose RZE-42; this task is too big; break <taskRef into smaller pieces).
Run `npx skills add FrkAk/piyaz --skill decompose-task -a claude-code`. Or copy the skill folder (plugins/codex/skills/decompose-task in FrkAk/piyaz) into .claude/skills/decompose-task in your project. Claude Code loads it when a task matches its description.
Run `npx skills add FrkAk/piyaz --skill decompose-task -a codex`. Or copy the skill folder (plugins/codex/skills/decompose-task in FrkAk/piyaz) into .agents/skills/decompose-task in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add FrkAk/piyaz --skill decompose-task -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/decompose-task, .gemini/skills/decompose-task, .github/skills/decompose-task and .opencode/skills/decompose-task in your project.
SKILL.md names no scripts, command-line tools or credentials: Decompose Task is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Decompose Task is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.3k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Decompose Task: Advanced Swarm Orchestration (ruvnet/agentic-flow, 816 stars), Research Workflow (majiayu000/claude-skill-registry, 666 stars), Browser Search (Johell1NS/browser-search, 529 stars) and Gemini Interactions API (Ayuilos/Miffan, 192 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
FrkAk (a GitHub user) maintains it in FrkAk/piyaz, which has 194 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on September 29, 2026.
Source: FrkAk/piyaz on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.