{"id":13532559,"url":"https://github.com/juancarlospaco/cliche","last_synced_at":"2025-04-09T18:18:37.196Z","repository":{"id":44930528,"uuid":"391880067","full_name":"juancarlospaco/cliche","owner":"juancarlospaco","description":"AutoMagic CLI argument parsing is cliche","archived":false,"fork":false,"pushed_at":"2025-03-26T09:37:16.000Z","size":185,"stargazers_count":84,"open_issues_count":2,"forks_count":1,"subscribers_count":2,"default_branch":"nim","last_synced_at":"2025-04-09T18:18:33.080Z","etag":null,"topics":["cli-args","cli-argument-parser","nim","nim-lang"],"latest_commit_sha":null,"homepage":"https://juancarlospaco.github.io/cliche","language":"Nim","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/juancarlospaco.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"custom":["https://gist.github.com/juancarlospaco/37da34ed13a609663f55f4466c4dbc3e"]}},"created_at":"2021-08-02T09:02:19.000Z","updated_at":"2025-03-26T09:37:20.000Z","dependencies_parsed_at":"2023-02-17T03:00:38.638Z","dependency_job_id":"fc538b77-2219-4eb4-ae23-d2bfb8d660aa","html_url":"https://github.com/juancarlospaco/cliche","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juancarlospaco%2Fcliche","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juancarlospaco%2Fcliche/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juancarlospaco%2Fcliche/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juancarlospaco%2Fcliche/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/juancarlospaco","download_url":"https://codeload.github.com/juancarlospaco/cliche/tar.gz/refs/heads/nim","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248085326,"owners_count":21045139,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli-args","cli-argument-parser","nim","nim-lang"],"created_at":"2024-08-01T07:01:11.857Z","updated_at":"2025-04-09T18:18:37.179Z","avatar_url":"https://github.com/juancarlospaco.png","language":"Nim","funding_links":["https://gist.github.com/juancarlospaco/37da34ed13a609663f55f4466c4dbc3e"],"categories":["Development Tools","[Nim](https://nim-lang.org/)"],"sub_categories":["Command-Line Interface Automation","Useful awesome list for Go cli"],"readme":"# CLIche\n\n- AutoMagic CLI argument parsing is so Cliché.\n\n![](https://raw.githubusercontent.com/juancarlospaco/cliche/nim/cliche.jpg \"Image is so Cliché\")\n\n\n# Examples\n\n```nim\nimport cliche\n# Use https://nim-lang.github.io/Nim/os.html#commandLineParams\n# let real = commandLineParams()\nlet fake = @[\"--a=1\", \"--v_1=9.9\", \"--v2=1\", \"--v3=2\", \"--v4=X\", \"--v5=t\", \"--v6=z\", \"--help\"]\nfake.getOpt (a: int.high, v_1: 3.14, v2: 9'u64, v3: -9'i64, v4: \"a\", v5: '4', v6: cstring\"b\", missing: 42)\ndoAssert a == 1\ndoAssert v_1 == 9.9\ndoAssert v2 == 1'u64\ndoAssert v3 == 2'i64\ndoAssert v4 == \"X\"\ndoAssert v5 == 't'\ndoAssert v6 == cstring\"z\"\ndoAssert missing == 42  ## missing is not in fake, fallback to default value 42.\n```\n\n* Auto-Generated `--help` (Can be parsed as TSV)\n\n```console\n$ example --help\n key     type    default\n --a=    int     int.high\n --v_1=  float   3.14\n --v2=   uint    9'u64\n --v3=   int     -9'i64\n --v4=   string  \"a\"\n --v5=   char    '4'\n --v6=   string  cstring\"b\"\n --missing=      int     42\n --help  ?       Some Help Message Here!\n\n$\n```\n\n\n# Cligen Vs Cliche\n\nImagine you just need `foo` to be `'z'`, with default to `'x'`.\n\nLets use Cligen (I dont really need a `func` but Cligen API needs it):\n\n```nim\nimport std/macros, cligen\nfunc x(foo = 'x') = doAssert foo == 'z'\nexpandMacros:\n  dispatch x\n```\n\nExpands to:\n\n```nim\n\nproc cligenScope(cf`gensym2: ClCfg) =\n  case cf`gensym2.sigPIPE\n  of spRaise:\n    discard\n  of spPass:\n    SIGPIPE_pass()\n  of spIsOk:\n    SIGPIPE_isOk()\n  if (\n    not (cast[pointer](cgVarSeqStrNil) == cgVarSeqStrNil)):\n  proc dispatchx(cmdline: seq[string] = mergeParams(@[\"x\"]); usage = clUse;\n                 prefix = \"\"; parseOnly = false; skipHelp = false; noHdr = false) =\n    {.push, hint[XDeclaredButNotUsed]: false.}\n    var ap: ArgcvtParams\n    ap.val4req = cf`gensym2.hTabVal4req\n    let shortH`gensym4 = \"h\"\n    var allParams: seq[string] = if (\n      0 \u003c len(cf`gensym2.helpSyntax)): @[\"help\", \"help-syntax\"] else: @[\"help\"]\n    var crbt: CritBitTree[string]\n    incl(crbt, optionNormalize(\"help\", \"_-\"), \"help\")\n    if (\n      0 \u003c len(cf`gensym2.helpSyntax)):\n      incl(crbt, optionNormalize(\"help-syntax\", \"_-\"), \"help-syntax\")\n    var mand: seq[string]\n    var tab: TextTab = @[]\n    let helpHelpRow`gensym4 = @[\"-\" \u0026 shortH`gensym4 \u0026 \", --help\", \"\", \"\",\n                                (\"help\", \"print this cligen-erated help\")[1]]\n    if skipHelp:\n      if\n        not (shortH`gensym4 == \"h\") and\n        not ((\"help\", \"print this cligen-erated help\")[1] ==\n            cf`gensym2.hTabSuppress):\n        add(tab, helpHelpRow`gensym4)\n    elif\n      not ((\"help\", \"print this cligen-erated help\")[1] ==\n          cf`gensym2.hTabSuppress):\n      add(tab, helpHelpRow`gensym4)\n    if\n      0 \u003c len(cf`gensym2.helpSyntax) and\n      not ((\"help-syntax\", \"advanced: prepend,plurals,..\")[1] ==\n          cf`gensym2.hTabSuppress) and\n        not skipHelp:\n      add(tab, @[\"--help-syntax\", \"\", \"\",\n                 (\"help-syntax\", \"advanced: prepend,plurals,..\")[1]])\n    ap.shortNoVal = {shortH`gensym4[0]}\n    ap.longNoVal = @[\"help\", \"help-syntax\"]\n    let setByP: ptr seq[ClParse] = cgSetByParseNil\n    proc mayRend(x`gensym4: string): string =\n      result = if (\n        not (cf`gensym2.render == nil)): cf`gensym2.render(x`gensym4)\n      else:\n        x`gensym4\n\n    if (\n      0 \u003c len(cf`gensym2.version)):\n      add(allParams, \"version\")\n      incl(crbt, optionNormalize(\"version\", \"_-\"), \"version\")\n      ap.parNm = \"version\"\n      ap.parSh = \"\\x00\"\n      ap.parReq = 0\n      ap.parRend = (\"version\", \"print version\")[0]\n      if (\n        not ((\"version\", \"print version\")[1] == cf`gensym2.hTabSuppress)):\n        add(tab, argHelp(false, ap) \u0026 (\"version\", \"print version\")[1])\n    var fooParamDispatch = 'x'\n    var fooParamDefault = fooParamDispatch\n    ap.parNm = \"foo\"\n    ap.parSh = \"f\"\n    ap.parReq = 0\n    ap.parRend = if (\n      false): \"\" else: helpCase(\"foo\", clLongOpt)\n    let descr`gensym6 = getDescription(fooParamDispatch, \"foo\", \"\")\n    if (\n      not (descr`gensym6 == cf`gensym2.hTabSuppress)):\n      add(tab, argHelp(fooParamDispatch, ap) \u0026 mayRend(descr`gensym6))\n    if (\n      not (ap.parReq == 0)):\n      tab[BackwardsIndex(1)][2] = ap.val4req\n    incl(crbt, optionNormalize(\"foo\", \"_-\"), move(ap.parRend))\n    add(allParams, helpCase(\"foo\", clLongOpt))\n    let ww`gensym7 = wrapWidth(cf`gensym2.widthEnv, ttyWidth)\n    let indentDoc`gensym7 = addPrefix(prefix, wrap(mayRend(\"\"), ww`gensym7, 3,\n        len(prefix)))\n    proc hl(tag`gensym7, val`gensym7: string): string =\n      result = getOrDefault(cf`gensym2.helpAttr, tag`gensym7, \"\") \u0026 val`gensym7 \u0026\n          getOrDefault(cf`gensym2.helpAttrOff, tag`gensym7, \"\")\n\n    let use`gensym7 = if noHdr: if (\n      0 \u003c len(cf`gensym2.use)): cf`gensym2.use\n    else:\n      usage\n     else: if (\n      0 \u003c len(cf`gensym2.useHdr)): cf`gensym2.useHdr else: clUseHdr \u0026\n        if (\n      0 \u003c len(cf`gensym2.use)): cf`gensym2.use else: usage\n    ap.help = use`gensym7 %\n        [\"doc\", hl(\"doc\", indentDoc`gensym7), \"command\", hl(\"cmd\", \"x\"), \"args\",\n         hl(\"args\", \"[optional-params] \"), \"options\", addPrefix(prefix \u0026 \"  \", alignTable(\n        tab, 2 * len(prefix) + 2, cf`gensym2.hTabColGap, cf`gensym2.hTabMinLast,\n        cf`gensym2.hTabRowSep, toInts(cf`gensym2.hTabCols), onCols(cf`gensym2),\n        offCols(cf`gensym2), \"\", ww`gensym7, printedLen))]\n    if\n      0 \u003c len(ap.help) and\n      not (ap.help[BackwardsIndex(1)] == '\\n'):\n      ap.help \u0026= \"\\n\"\n    if (\n      0 \u003c len(prefix)):\n      ap.help = addPrefix(prefix, ap.help)\n    var keyCount = initCountTable(32)\n    proc parser(args`gensym17 = cmdline; provideDflAlias = true) =\n      var posNo = 0\n      var p = initOptParser(args`gensym17, ap.shortNoVal, ap.longNoVal,\n                            cf`gensym2.reqSep, cf`gensym2.sepChars,\n                            cf`gensym2.opChars, @[], cf`gensym2.longPfxOk,\n                            cf`gensym2.stopPfxOk)\n      while true:\n        next(p)\n        if p.kind == cmdEnd:\n          break\n        if p.kind == cmdError:\n          if (\n            not (cast[pointer](setByP) == cgSetByParseNil)):\n            add(setByP[], (\"\", \"\", move(p.message), clParseOptErr))\n          if not parseOnly:\n            write(stderr, [p.message, \"\\n\"])\n          break\n        case p.kind\n        of cmdLongOption, cmdShortOption:\n          case if p.kind == cmdLongOption: lengthen(crbt, p.key,\n              cf`gensym2.longPfxOk)\n          else:\n            p.key\n          of \"help\", \"h\":\n            if (\n              not (cast[pointer](setByP) == cgSetByParseNil)):\n              add(setByP[], (\"help\", \"\", ap.help, clHelpOnly))\n            if not parseOnly:\n              write(stdout, ap.help)\n              raise\n                (ref HelpOnly)(msg: \"\", parent: nil)\n          of \"helpsyntax\":\n            if (\n              not (cast[pointer](setByP) == cgSetByParseNil)):\n              add(setByP[],\n                  (\"helpsyntax\", \"\", cf`gensym2.helpSyntax, clHelpOnly))\n            if not parseOnly:\n              write(stdout, cf`gensym2.helpSyntax)\n              raise\n                (ref HelpOnly)(msg: \"\", parent: nil)\n          of \"version\", \"\\x00\":\n            if (\n              not (cast[pointer](setByP) == cgSetByParseNil)):\n              add(setByP[], (\"version\", \"\", cf`gensym2.version, clVersionOnly))\n            if not parseOnly:\n              if (\n                0 \u003c len(cf`gensym2.version)):\n                write(stdout, [cf`gensym2.version, \"\\n\"])\n                raise\n                  (ref VersionOnly)(msg: \"\", parent: nil)\n              else:\n                write(stdout, \"Unknown version\\n\")\n                raise\n                  (ref VersionOnly)(msg: \"\", parent: nil)\n          of \"foo\", \"f\":\n            ap.key = p.key\n            ap.val = p.val\n            ap.sep = p.sep\n            ap.parNm = \"foo\"\n            ap.parRend = helpCase(\"foo\", clLongOpt)\n            inc(keyCount, \"foo\", 1)\n            ap.parCount = keyCount[\"foo\"]\n            if (\n              not (cast[pointer](setByP) == cgSetByParseNil)):\n              if argParse(fooParamDispatch, fooParamDefault, ap):\n                add(setByP[], (\"foo\", move(p.val), \"\", clOk))\n              else:\n                add(setByP[], (\"foo\", move(p.val),\n                               \"Cannot parse arg to \" \u0026 ap.key, clBadVal))\n            if not parseOnly:\n              if not argParse(fooParamDispatch, fooParamDefault, ap):\n                write(stderr, ap.msg)\n                raise\n                  (ref ParseError)(msg: \"Cannot parse arg to \" \u0026 ap.key,\n                                   parent: nil)\n            discard delItem(mand, \"foo\")\n          of \"\":\n            let ks`gensym13 = valsWithPfx(crbt, p.key)\n            let msg`gensym13 = \"Ambiguous long option prefix \\\"$1\\\" matches:\\n  $2 \" %\n                [p.key, join(ks`gensym13, \"\\n  \")] \u0026\n                \"\\nRun with --help for more details.\\n\"\n            if (\n              not (cast[pointer](setByP) == cgSetByParseNil)):\n              add(setByP[], (move(p.key), move(p.val), msg`gensym13, clBadKey))\n            if not parseOnly:\n              write(stderr, msg`gensym13)\n              raise\n                (ref ParseError)(msg: \"Unknown option\", parent: nil)\n          else:\n            var\n              mb`gensym14: string\n              k`gensym14: string\n            k`gensym14 = \"short\"\n            if p.kind == cmdLongOption:\n              k`gensym14 = \"long\"\n              var idNorm`gensym14: seq[string]\n              for id`gensym14 in items(allParams):\n                add(idNorm`gensym14, optionNormalize(id`gensym14, \"_-\"))\n              let sugg`gensym14 = suggestions(optionNormalize(p.key, \"_-\"),\n                  idNorm`gensym14, allParams, 3, C(4))\n              if (\n                0 \u003c len(sugg`gensym14)):\n                mb`gensym14 \u0026=\n                    \"Maybe you meant one of:\\n\\t\" \u0026 join(sugg`gensym14, \" \") \u0026\n                    \"\\n\\n\"\n            let msg`gensym14 = \"Unknown \" \u0026 k`gensym14 \u0026 \" option: \\\"\" \u0026 p.key \u0026\n                \"\\\"\\n\\n\" \u0026\n                mb`gensym14 \u0026\n                \"Run with --help for full usage.\\n\"\n            if (\n              not (cast[pointer](setByP) == cgSetByParseNil)):\n              add(setByP[], (move(p.key), move(p.val), msg`gensym14, clBadKey))\n            if not parseOnly:\n              write(stderr, msg`gensym14)\n              raise\n                (ref ParseError)(msg: \"Unknown option\", parent: nil)\n        else:\n          let msg`gensym15 = \"Unexpected non-option \" \u0026 $p.key\n          if (\n            not (cast[pointer](setByP) == cgSetByParseNil)):\n            add(setByP[],\n                (move(ap.key), move(p.val), msg`gensym15, clNonOption))\n          if not parseOnly:\n            write(stderr, \"x does not expect non-option arguments at \\\"\" \u0026\n                $p.key \u0026\n                \"\\\".\\nRun with --help for full usage.\\n\")\n            raise\n              (ref ParseError)(msg: msg`gensym15, parent: nil)\n\n    {.pop.}\n    parser(cmdline, true)\n    if (\n      0 \u003c len(mand)):\n      if (\n        not (cast[pointer](setByP) == cgSetByParseNil)):\n        for m`gensym17 in items(mand):\n          add(setByP[], (m`gensym17, \"\", \"Missing \" \u0026 m`gensym17, clMissing))\n      if not parseOnly:\n        write(stderr, \"Missing these required parameters:\\n\")\n        for m`gensym17 in items(mand):\n          write(stderr, [\"  \", m`gensym17, \"\\n\"])\n        write(stderr, \"Run command with --help for more details.\\n\")\n        raise\n          (ref ParseError)(msg: \"Missing one/some mandatory args\", parent: nil)\n    if parseOnly or\n      not (cast[pointer](setByP) == cgSetByParseNil) and\n      0 \u003c numOfStatus(setByP[], ClNoCall):\n      return\n    x(fooParamDispatch)\n\n  try:\n    dispatchx(mergeParams([\"\"], commandLineParams()), clUse, \"\", false, false,\n              false)\n    quit(0)\n  except HelpOnly, VersionOnly:\n    quit(0)\n  except ParseError:\n    quit(cgParseErrorExitCode)\n\n\ncligenScope(clCfg)\n\n```\n\n- Cligen can not compile for JavaScript targets.\n- Uses `cast`, `ref`, `nil`, `addr`, unsafe code, etc.\n- Run-time string concatenations `\u0026`.\n- Several `for` loops.\n- Several `import` and `export` from stdlib, several public symbols.\n- [Wont work with `template`, `macro`, anonimous `func`.](https://github.com/juancarlospaco/cliche/blob/nim/examples/example_cligen_err.nim)\n- Abbreviated CLI arguments (`--bar` is duplicated as `-b` too?).\n- [C Compilation warnings.](https://github.com/juancarlospaco/cliche/blob/nim/examples/cligen_compilation.md#c-compilation-warnings-in-cligen)\n- API enforces to use `proc`.\n\n\nLets use Cliche:\n\n```nim\nimport std/[macros, os, strutils], cliche\nexpandMacros:\n  commandLineParams().getOpt (foo: 'x')\ndoAssert foo == 'z'\n```\n\nExpands to:\n\n```nim\nvar foo = 'x'\nfor v in commandLineParams():\n  var sepPos: int\n  var k, b: string\n  if not(v.len \u003e 3) or v[0] != '-'  or v[1] != '-': continue\n  if v.len == 6 and v[0] == 'h' and v[1] == 'e' and v[2] == 'l' and v[3] == 'p':\n    quit(apiExplained, 0)\n  if len(v) == 8 and v[2] == 'x' and v[3] == 'd' and v[4] == 'e' and v[5] == 'b' and v[6] == 'u' and v[7] == 'g':\n    quit(debuginfos, 0)\n  for x in 2 .. v.len:\n    if v[x] == '=':\n      sepPos = x\n      break\n  k = v[2 ..\u003c sepPos]\n  b = v[sepPos .. ^1]\n  if k.len == 3 and k[0] == 'f' and k[1] == 'o' and k[2] == 'o':\n    foo = char(b[0])\n```\n\n- Cliche works for JavaScript targets [(Use with nodejs package)](https://github.com/juancarlospaco/nodejs#alternative-stdlib-for-nim-for-nodejsjavascript-targets).\n- No `cast`, no `ref`, no `nil`, no `addr`, no unsafe code.\n- Compile-time string ops.\n- **1** `for` loop.\n- 2 `import`, 0 `export` from stdlib, 1 public symbol.\n- Works with `template`, `macro`, etc.\n- No support for abbreviated CLI arguments (`--foo` in CLI is `foo` in code).\n- API just uses variables.\n- Supports `enum`, `Positive`, `Natural`, `BiggestUInt`, `BiggestInt`, `BiggestFloat`, `byte`, `cint`, `cfloat`.\n- Fallbacks for values: static default :arrow_right: env var :arrow_right: command line\n\n\n# Stars\n\n![](https://starchart.cc/juancarlospaco/cliche.svg)\n:star: [@juancarlospaco](https://github.com/juancarlospaco '2022-02-16')\n:star: [@nikitavoloboev](https://github.com/nikitavoloboev '2022-02-16')\n:star: [@zargot](https://github.com/zargot '2022-02-22')\n:star: [@artemklevtsov](https://github.com/artemklevtsov '2022-02-23')\n:star: [@AndrielFR](https://github.com/AndrielFR '2022-02-27')\n:star: [@jaco-codexorbis](https://github.com/jaco-codexorbis '2022-03-20')\n:star: [@nonimportant](https://github.com/nonimportant '2022-04-03')\n:star: [@hamidb80](https://github.com/hamidb80 '2022-05-07')\n:star: [@bichanna](https://github.com/bichanna '2022-05-07')\n:star: [@hugosenari](https://github.com/hugosenari '2022-06-01')\n:star: [@Infinitybeond1](https://github.com/Infinitybeond1 '2022-07-20')\n:star: [@kamilchm](https://github.com/kamilchm '2022-08-17')\n:star: [@pedrovhb](https://github.com/pedrovhb '2022-08-25')\n:star: [@foxoman](https://github.com/foxoman '2022-11-16')\n:star: [@pietroppeter](https://github.com/pietroppeter '2022-11-19')\t\n:star: [@srozb](https://github.com/srozb '2022-11-20')\t\n:star: [@xilicode](https://github.com/xilicode '2022-11-26')\t\n:star: [@ccamateur](https://github.com/ccamateur '2022-12-27')\t\n:star: [@ThomasTJdev](https://github.com/ThomasTJdev '2023-01-11')\t\n:star: [@dsrw](https://github.com/dsrw '2023-01-11')\t\n:star: [@sirredbeard](https://github.com/sirredbeard '2023-01-11')\t\n:star: [@mrgaturus](https://github.com/mrgaturus '2023-01-11')\t\n:star: [@maleyva1](https://github.com/maleyva1 '2023-01-11')\t\n:star: [@jacob-2](https://github.com/jacob-2 '2023-01-12')\t\n:star: [@sevagh](https://github.com/sevagh '2023-01-12')\t\n:star: [@elcritch](https://github.com/elcritch '2023-01-13')\t\n:star: [@teroz](https://github.com/teroz '2023-01-13')\t\n:star: [@Kesefon](https://github.com/Kesefon '2023-01-13')\t\n:star: [@svercl](https://github.com/svercl '2023-01-14')\t\n:star: [@AlexandrosKap](https://github.com/AlexandrosKap '2023-01-14')\t\n:star: [@qununc](https://github.com/qununc '2023-01-16')\t\n:star: [@rauny-brandao](https://github.com/rauny-brandao '2023-01-21')\t\n:star: [@Mycsina](https://github.com/Mycsina '2023-01-22')\t\n:star: [@KlausEverWalkingDev](https://github.com/KlausEverWalkingDev '2023-01-22')\t\n:star: [@nikhilsimha](https://github.com/nikhilsimha '2023-01-25')\t\n:star: [@DeanHnter](https://github.com/DeanHnter '2023-01-26')\t\n:star: [@yaroslav-gwit](https://github.com/yaroslav-gwit '2023-01-27')\t\n:star: [@hydralisk98](https://github.com/hydralisk98 '2023-01-31')\t\n:star: [@slicklash](https://github.com/slicklash '2023-02-01')\t\n:star: [@GabrielLasso](https://github.com/GabrielLasso '2023-02-02')\t\n:star: [@ippaveln](https://github.com/ippaveln '2023-02-05')\t\n:star: [@seipy](https://github.com/seipy '2023-02-07')\t\n:star: [@krisskross](https://github.com/krisskross '2023-02-08')\t\n:star: [@noahehall](https://github.com/noahehall '2023-02-09')\t\n:star: [@Notiee](https://github.com/Notiee '2023-02-10')\t\n:star: [@linwaytin](https://github.com/linwaytin '2023-02-11')\t\n:star: [@insolitum](https://github.com/insolitum '2023-02-11')\t\n:star: [@adokitkat](https://github.com/adokitkat '2023-02-12')\t\n:star: [@doongjohn](https://github.com/doongjohn '2023-02-13')\t\n:star: [@roclimber1](https://github.com/roclimber1 '2023-02-15')\t\n:star: [@mimame](https://github.com/mimame '2023-02-16')\t\n:star: [@sgmihai](https://github.com/sgmihai '2023-02-20')\t\n:star: [@sincspecv](https://github.com/sincspecv '2023-02-27')\t\n:star: [@Tim-Hartmann](https://github.com/Tim-Hartmann '2023-03-01')\t\n:star: [@lucidrains](https://github.com/lucidrains '2023-03-07')\t\n:star: [@tuxcanfly](https://github.com/tuxcanfly '2023-03-07')\t\n:star: [@kyegomez](https://github.com/kyegomez '2023-03-08')\t\n:star: [@Yuan-ManX](https://github.com/Yuan-ManX '2023-03-08')\t\n:star: [@xchanmolx](https://github.com/xchanmolx '2023-03-08')\t\n:star: [@ShalokShalom](https://github.com/ShalokShalom '2023-03-15')\t\n:star: [@marcusramberg](https://github.com/marcusramberg '2023-03-27')\t\n:star: [@fartek](https://github.com/fartek '2023-04-10')\t\n:star: [@peterhil](https://github.com/peterhil '2023-05-09')\t\n:star: [@nschlemm](https://github.com/nschlemm '2023-05-13')\t\n:star: [@KolyaRS](https://github.com/KolyaRS '2023-09-05')\t\n:star: [@caden-parajuli](https://github.com/caden-parajuli '2023-09-05')\t\n:star: [@vosscodes](https://github.com/vosscodes '2023-09-15')\t\n:star: [@arkanoid87](https://github.com/arkanoid87 '2023-09-20')\t\n:star: [@vosscodes](https://github.com/vosscodes '2023-10-06')\t\n:star: [@vosscodes](https://github.com/vosscodes '2023-10-06')\t\n:star: [@vosscodes](https://github.com/vosscodes '2023-10-06')\t\n:star: [@vosscodes](https://github.com/vosscodes '2023-10-06')\t\n:star: [@vosscodes](https://github.com/vosscodes '2023-10-06')\t\n:star: [@vosscodes](https://github.com/vosscodes '2023-10-06')\t\n:star: [@vosscodes](https://github.com/vosscodes '2023-10-06')\t\n:star: [@vosscodes](https://github.com/vosscodes '2023-10-06')\t\n:star: [@vosscodes](https://github.com/vosscodes '2023-10-06')\t\n:star: [@xjzh123](https://github.com/xjzh123 '2023-10-13')\t\n:star: [@Expector-Hutch](https://github.com/Expector-Hutch '2023-10-17')\t\n:star: [@Pent](https://github.com/Pent '2024-02-19')\t\n:star: [@succumbs](https://github.com/succumbs '2024-02-24')\t\n:star: [@Lulzx](https://github.com/Lulzx '2024-02-24')\t\n:star: [@tuanductran](https://github.com/tuanductran '2024-05-29')\t\n:star: [@armed](https://github.com/armed '2024-06-17')\t\n:star: [@NahuelUTNPigui](https://github.com/NahuelUTNPigui '2024-07-02')\t\n:star: [@planetis-m](https://github.com/planetis-m '2024-07-02')\t\n:star: [@SpotlightKid](https://github.com/SpotlightKid '2024-07-07')\t\n:star: [@am-zed](https://github.com/am-zed '2024-07-23')\t\n:star: [@g5becks](https://github.com/g5becks '2024-09-04')\t\n:star: [@suryan](https://github.com/suryan '2024-10-04')\t\n:star: [@zaits07](https://github.com/zaits07 '2025-01-11')\t\n:star: [@titanomachy](https://github.com/titanomachy '2025-02-25')\t\n:star: [@nimelias](https://github.com/nimelias '2025-03-26')\t\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuancarlospaco%2Fcliche","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjuancarlospaco%2Fcliche","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuancarlospaco%2Fcliche/lists"}