{"id":13469682,"url":"https://github.com/balazsbotond/urlcat","last_synced_at":"2025-04-23T20:57:34.311Z","repository":{"id":40709630,"uuid":"295847167","full_name":"balazsbotond/urlcat","owner":"balazsbotond","description":"A URL builder library for JavaScript.","archived":false,"fork":false,"pushed_at":"2025-04-14T21:49:03.000Z","size":1486,"stargazers_count":1832,"open_issues_count":21,"forks_count":58,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-04-19T03:07:06.048Z","etag":null,"topics":["builder","query-string","querystring","url"],"latest_commit_sha":null,"homepage":"https://urlcat.org","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/balazsbotond.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":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-09-15T20:55:10.000Z","updated_at":"2025-04-17T21:50:14.000Z","dependencies_parsed_at":"2023-10-14T23:31:59.950Z","dependency_job_id":"18bf61e1-149c-41b6-a4ce-c9da7999d7bd","html_url":"https://github.com/balazsbotond/urlcat","commit_stats":{"total_commits":337,"total_committers":23,"mean_commits":"14.652173913043478","dds":0.6735905044510386,"last_synced_commit":"d5834df094b4e436ebf3ba3bf015857798f29675"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/balazsbotond%2Furlcat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/balazsbotond%2Furlcat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/balazsbotond%2Furlcat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/balazsbotond%2Furlcat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/balazsbotond","download_url":"https://codeload.github.com/balazsbotond/urlcat/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249750089,"owners_count":21320075,"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":["builder","query-string","querystring","url"],"created_at":"2024-07-31T15:01:50.541Z","updated_at":"2025-04-23T20:57:34.276Z","avatar_url":"https://github.com/balazsbotond.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cbr\u003e\n  \u003cimg src=\"docs/cat.svg\" alt=\"Markdownify\"\u003e\n  \u003cbr\u003e\n  urlcat\n  \u003cbr\u003e\n\u003c/h1\u003e\n\n\u003ch4 align=\"center\"\u003eBuild correct URLs easily.\u003c/h4\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/balazsbotond/urlcat/actions\"\u003e\n    \u003cimg src=\"https://github.com/balazsbotond/urlcat/actions/workflows/ci.yml/badge.svg\"\n         alt=\"Build Status\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/urlcat\"\u003e\n    \u003cimg src=\"https://img.shields.io/npm/v/urlcat.svg?style=flat\" alt=\"npm version\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://bundlephobia.com/result?p=urlcat\"\u003e\n    \u003cimg src=\"https://badgen.net/bundlephobia/minzip/urlcat\" alt=\"minzipped size\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://coveralls.io/github/balazsbotond/urlcat?branch=master\"\u003e\n    \u003cimg src=\"https://coveralls.io/repos/github/balazsbotond/urlcat/badge.svg?branch=master\" alt=\"Coverage Status\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#what\"\u003eWhat?\u003c/a\u003e •\n  \u003ca href=\"#why\"\u003eWhy?\u003c/a\u003e •\n  \u003ca href=\"#how\"\u003eHow?\u003c/a\u003e •\n  \u003ca href=\"#typescript\"\u003eTypeScript\u003c/a\u003e •\n  \u003ca href=\"#api\"\u003eAPI\u003c/a\u003e •\n  \u003ca href=\"#help\"\u003eHelp\u003c/a\u003e •\n  \u003ca href=\"#contribute\"\u003eContribute\u003c/a\u003e\n\u003c/p\u003e\n\n## What?\n\n*urlcat* is a tiny JavaScript library that makes building URLs very convenient and prevents common mistakes.\n\n\u003cbr\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/urlcat-basic-usage.svg#gh-light-mode-only\"\u003e\n  \u003cimg src=\"docs/urlcat-basic-usage-dark.svg#gh-dark-mode-only\"\u003e\n\u003c/p\u003e\n\n### Features\n\n\u003ccenter\u003e\n  \u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth align=\"center\"\u003e\u003cstrong\u003ev3\u003c/strong\u003e\u003c/th\u003e\n      \u003cth align=\"center\"\u003e\u003cstrong\u003ev2\u003c/strong\u003e\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\"\u003eLatest version\u003c/td\u003e\n      \u003ctd align=\"center\"\u003eActively supported\u003cbr\u003elegacy version\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" colspan=\"2\"\u003eThe same friendly API\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\"\u003eOnly \u003ca href=\"https://www.npmjs.com/package/qs\"\u003eone dependency\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003eNo dependencies\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\"\u003e10.5KB \u003ca href=\"https://bundlephobia.com/package/urlcat@3.0.0\"\u003eminified and gzipped\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\"\u003e0.8KB \u003ca href=\"https://bundlephobia.com/package/urlcat@2.0.4\"\u003eminified and gzipped\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" colspan=\"2\"\u003eTypeScript types provided\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n  \u003c/table\u003e\n\u003c/center\u003e\n\n## Why?\n\nWhen I call an HTTP API, I usually need to add dynamic parameters to the URL:\n\n~~~js\nconst API_URL = 'https://api.example.com/';\n\nfunction getUserPosts(id, blogId, limit, offset) {\n  const requestUrl = `${API_URL}/users/${id}/blogs/${blogId}/posts?limit=${limit}\u0026offset=${offset}`;\n  // send HTTP request\n}\n~~~\n\nAs you can see, this minimal example is already rather hard to read. It is also incorrect:\n\n- I forgot that there was a trailing slash at the end of the `API_URL` constant so this resulted in a URL containing duplicate slashes (`https://api.example.com//users`).\n- The embedded values need to be escaped using `encodeURIComponent`\n\nI can use the built-in `URL` class to prevent duplicate slashes and `URLSearchParams` to escape the query string. But I still need to escape all path parameters manually.\n\n~~~js\nconst API_URL = 'https://api.example.com/';\n\nfunction getUserPosts(id, blogId, limit, offset) {\n  const escapedId = encodeURIComponent(id);\n  const escapedBlogId = encodeURIComponent(blogId);\n  const path = `/users/${escapedId}/blogs/${escapedBlogId}`;\n  const url = new URL(path, API_URL);\n  url.search = new URLSearchParams({ limit, offset });\n  const requestUrl = url.href;\n  // send HTTP request\n}\n~~~\n\nSuch a simple task and yet very hard to read and tedious to write! This is where this tiny library can help you:\n\n~~~js\nconst API_URL = 'https://api.example.com/';\n\nfunction getUserPosts(id, limit, offset) {\n  const requestUrl = urlcat(API_URL, '/users/:id/posts', { id, limit, offset });\n  // send HTTP request\n}\n~~~\n\nThe library handles:\n- escaping all parameters\n- concatenating all parts (there will always be exactly one \u003ckbd\u003e/\u003c/kbd\u003e and \u003ckbd\u003e?\u003c/kbd\u003e character between them)\n\n## How?\n\n### Install\n\nCurrently, the package is distributed via npm. Zip downloads are also available since v3.0.0 (A CDN is coming soon).\n\n```bash\nnpm install --save urlcat\n```\n\n### Usage with Node (CommonJS/CJS)\n\nNode 14 and above are officially supported, though you may have luck using it with an earlier Node version.\nSince the code uses the `URL` and `URLSearchParams` classes internally, which aren't available below Node v10, the library is known not to work with those versions.\n\nTo build full URLs (most common use case):\n\n```ts\nconst urlcat = require('urlcat').default;\n```\n\nTo use any of the utility functions:\n\n```ts\nconst { query, subst, join } = require('urlcat');\n```\n\nTo use all exported functions:\n\n```ts\nconst { default: urlcat, query, subst, join } = require('urlcat');\n```\n\n### Usage with Node (ES Module)\n\nStarting with v3.1.0, urlcat supports ESM!\n\nTo build full URLs (most common use case):\n\n```ts\nimport urlcat from 'urlcat';\n```\n\nTo use any of the utility functions:\n\n```ts\nimport { query, subst, join } from 'urlcat';\n```\n\nTo use all exported functions:\n\n```ts\nimport urlcat, { query, subst, join } from 'urlcat';\n```\n\n### Usage with TypeScript\n\nTypeScript 2.1 and above are officially supported.\n\nTo build full URLs (most common use case):\n\n```ts\nimport urlcat from 'urlcat';\n```\n\nTo use any of the utility functions:\n\n```ts\nimport { query, subst, join } from 'urlcat';\n```\n\nTo use all exported functions:\n\n```ts\nimport urlcat, { query, subst, join } from 'urlcat';\n```\n\n## TypeScript\n\nThis library provides its own type definitions. \"It just works\", no need to install anything from `@types`.\n\n## API\n\n### `ParamMap`: an object with string keys\n\n```ts\ntype ParamMap = Record\u003cstring, any\u003e;\n```\n\nFor example, `{ firstParam: 1, 'second-param': 2 }` is a valid `ParamMap`.\n\n### `urlcat`: build full URLs\n\n```ts\nfunction urlcat(baseUrl: string, pathTemplate: string, params: ParamMap): string\nfunction urlcat(baseUrl: string, pathTemplate: string): string\nfunction urlcat(baseTemplate: string, params: ParamMap): string\n```\n\n#### Examples\n\n\u003cul\u003e\n  \u003cli\u003e\n    \u003ccode\u003eurlcat('https://api.example.com', '/users/:id/posts', { id: 123, limit: 10, offset: 120 })\u003c/code\u003e\u003cbr\u003e\n    → \u003ccode\u003e'https://api.example.com/users/123/posts?limit=10\u0026offset=120'\u003c/code\u003e\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eurlcat('http://example.com/', '/posts/:title', { title: 'Letters \u0026 \"Special\" Characters' })\u003c/code\u003e\u003cbr\u003e\n    → \u003ccode\u003e'http://example.com/posts/Letters%20%26%20%22Special%22%20Characters'\u003c/code\u003e\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eurlcat('https://api.example.com', '/users')\u003c/code\u003e\u003cbr\u003e\n    → \u003ccode\u003e'https://api.example.com/users'\u003c/code\u003e\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eurlcat('https://api.example.com/', '/users')\u003c/code\u003e\u003cbr\u003e\n    → \u003ccode\u003e'https://api.example.com/users'\u003c/code\u003e\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eurlcat('http://example.com/', '/users/:userId/posts/:postId/comments', { userId: 123, postId: 987, authorId: 456, limit: 10, offset: 120 })\u003c/code\u003e\u003cbr\u003e\n    → \u003ccode\u003e'http://example.com/users/123/posts/987/comments?authorId=456\u0026limit=10\u0026offset=120'\u003c/code\u003e\n  \u003c/li\u003e\n\u003c/ul\u003e\n\n**NOTE about empty path segments:** \n[RFC 3986](https://tools.ietf.org/html/rfc3986) allows empty path segments in URLs (for example, `https://example.com//users////2`). *urlcat* keeps any empty path segments that aren't at the concatenation boundary between `baseUrl` and `pathTemplate`. To include an empty path segment there are two options:\n- use a double slash: `urlcat('https://example.com/', '//users', { q: 1 })` → `https://example.com//users?q=1`\n- use the `baseTemplate` overload: `urlcat('https://example.com//users', { q: 1 })` → `https://example.com//users?q=1`\n\n### `query`: build query strings\n\n```ts\nfunction query(params: ParamMap): string\n```\n\nBuilds a query string using the key-value pairs specified. Keys and values are escaped, then joined by the `'\u0026'` character.\n\n#### Examples\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003e\u003ccode\u003eparams\u003c/code\u003e\u003c/th\u003e\u003cth\u003eresult\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003e{}\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e''\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003e{ query: 'some text' }\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e'query=some%20text'\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003e{ id: 42, 'comment-id': 86 }\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e'id=42\u0026comment-id=86'\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003e{ id: 42, 'a name': 'a value' }\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e'id=42\u0026a%20name=a%20value'\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### `subst`: substitute path parameters\n\n```ts\nfunction subst(template: string, params: ParamMap): string\n```\n\nSubstitutes parameters with values in a template string. `template` may contain 0 or more parameter placeholders. Placeholders start with a colon (`:`), followed by a parameter name that can only contain uppercase or lowercase letters. Any placeholders found in the template are replaced with the value under the corresponding key in `params`.\n\n#### Examples\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003e\u003ccode\u003etemplate\u003c/code\u003e\u003c/th\u003e\u003cth\u003e\u003ccode\u003eparams\u003c/code\u003e\u003c/th\u003e\u003cth\u003eresult\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003e':id'\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e{ id: 42 }\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e'42'\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003e'/users/:id'\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e{ id: 42 }\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e'/users/42'\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003e'/users/:id/comments/:commentId'\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e{ id: 42, commentId: 86 }\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e'/users/42/comments/86'\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003e'/users/:id'\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e{ id: 42, foo: 'bar' }\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e'/users/42'\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n### `join`: join two strings using exactly one separator\n\n```ts\nfunction join(part1: string, separator: string, part2: string): string\n```\n\nJoins the two parts using exactly one separator. If a separator is present at the end of `part1` or the beginning of `part2`, it is removed, then the two parts are joined using `separator`.\n\n#### Examples\n\n\u003ctable\u003e\n  \u003ctr\u003e\u003cth\u003e\u003ccode\u003epart1\u003c/code\u003e\u003c/th\u003e\u003cth\u003e\u003ccode\u003eseparator\u003c/code\u003e\u003c/th\u003e\u003cth\u003e\u003ccode\u003epart2\u003c/code\u003e\u003c/th\u003e\u003cth\u003eresult\u003c/th\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003e'first'\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e','\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e'second'\u003c/code\u003e\u003c/td\u003e\u003ctd rowspan=\"4\"\u003e\u003ccode\u003e'first,second'\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003e'first,'\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e','\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e'second'\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003e'first'\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e','\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e',second'\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\u003ctd\u003e\u003ccode\u003e'first,'\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e','\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e',second'\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n## Help\n\nThank you for using *urlcat*!\n\nIf you need any help using this library, feel free to [create a GitHub issue](https://github.com/balazsbotond/urlcat/issues/new/choose), and ask your questions. I'll try to answer as quickly as possible.\n\n## Contribute\n\nContributions of any kind (pull requests, bug reports, feature requests, documentation, design) are more than welcome! If you like this project and want to help, but feel like you are stuck, feel free to contact the maintainer (Botond Balázs \u0026lt;balazsbotond@gmail.com\u0026gt;).\n\n### Building from source\n\nBuilding the project should be quick and easy. If it isn't, it's the maintainer's fault. Please report any problems with building in a GitHub issue.\n\nYou need to have a reasonably recent version of node.js to build *urlcat*. \nTested on node version 12.18.3 and npm version 6.14.6.\n\nFirst, clone the git repository:\n\n```\ngit clone git@github.com:balazsbotond/urlcat.git\n```\n\nThen switch to the newly created urlcat directory and install the dependencies:\n\n```\ncd urlcat\nnpm install\n```\n\nYou can then run the unit tests to verify that everything works correctly:\n\n```\nnpm test\n```\n\nAnd finally, build the library:\n\n```\nnpm run build\n```\n\nThe output will appear in the `dist` directory.\n\nHappy hacking!\n\n## Contributors ✨\n\n\u003c!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --\u003e\n[![All Contributors](https://img.shields.io/badge/all_contributors-19-orange.svg?style=flat-square)](#contributors-)\n\u003c!-- ALL-CONTRIBUTORS-BADGE:END --\u003e\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/3zk1m0\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/19320956?v=4?s=100\" width=\"100px;\" alt=\"3zk1m0\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003e3zk1m0\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-3zk1m0\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://alextes.me/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/2011351?v=4?s=100\" width=\"100px;\" alt=\"Alexander Tesfamichael\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAlexander Tesfamichael\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/balazsbotond/urlcat/issues?q=author%3Aalextes\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://www.linkedin.com/in/wwaryangupta/\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/42470695?v=4?s=100\" width=\"100px;\" alt=\"Aryan Gupta\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAryan Gupta\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/balazsbotond/urlcat/commits?author=withoutwaxaryan\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/balazsbotond\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/2791280?v=4?s=100\" width=\"100px;\" alt=\"Botond Balázs\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eBotond Balázs\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/balazsbotond/urlcat/commits?author=balazsbotond\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/balazsbotond/urlcat/commits?author=balazsbotond\" title=\"Tests\"\u003e⚠️\u003c/a\u003e \u003ca href=\"https://github.com/balazsbotond/urlcat/commits?author=balazsbotond\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#infra-balazsbotond\" title=\"Infrastructure (Hosting, Build-Tools, etc)\"\u003e🚇\u003c/a\u003e \u003ca href=\"https://github.com/balazsbotond/urlcat/issues?q=author%3Abalazsbotond\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"#maintenance-balazsbotond\" title=\"Maintenance\"\u003e🚧\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://www.echooff.dev\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/149248?v=4?s=100\" width=\"100px;\" alt=\"Christian Rackerseder\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eChristian Rackerseder\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/balazsbotond/urlcat/commits?author=screendriver\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://seinopsys.dev/\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/3200580?v=4?s=100\" width=\"100px;\" alt=\"David Joseph Guzsik\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDavid Joseph Guzsik\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/balazsbotond/urlcat/pulls?q=is%3Apr+reviewed-by%3ASeinopSys\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/drishit96\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/13049630?v=4?s=100\" width=\"100px;\" alt=\"Drishit Mitra\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDrishit Mitra\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#infra-drishit96\" title=\"Infrastructure (Hosting, Build-Tools, etc)\"\u003e🚇\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/gabrielsch\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/1733354?v=4?s=100\" width=\"100px;\" alt=\"Gabriel Schmitt\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eGabriel Schmitt\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-gabrielsch\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"https://github.com/balazsbotond/urlcat/commits?author=gabrielsch\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/harshilparmar\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/45915468?v=4?s=100\" width=\"100px;\" alt=\"Harshil Parmar\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eHarshil Parmar\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/balazsbotond/urlcat/commits?author=harshilparmar\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"http://www.jasonkohles.com\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/46860?v=4?s=100\" width=\"100px;\" alt=\"Jason Kohles\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJason Kohles\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/balazsbotond/urlcat/issues?q=author%3Ajasonk\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"https://github.com/balazsbotond/urlcat/commits?author=jasonk\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://knpw.rs\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/174864?v=4?s=100\" width=\"100px;\" alt=\"Ken Powers\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKen Powers\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#platform-knpwrs\" title=\"Packaging/porting to new platform\"\u003e📦\u003c/a\u003e \u003ca href=\"#userTesting-knpwrs\" title=\"User Testing\"\u003e📓\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"http://@engrkhizariqbal\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/5228711?v=4?s=100\" width=\"100px;\" alt=\"Khizar Iqbal\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKhizar Iqbal\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-EngrKhizarIqbal\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"#infra-EngrKhizarIqbal\" title=\"Infrastructure (Hosting, Build-Tools, etc)\"\u003e🚇\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/polysiya\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/722173?v=4?s=100\" width=\"100px;\" alt=\"Kim Kyudeok\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKim Kyudeok\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-polysiya\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://luyu.blog\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/2239547?v=4?s=100\" width=\"100px;\" alt=\"Luyu Cheng\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eLuyu Cheng\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/balazsbotond/urlcat/commits?author=chengluyu\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/praveen5959\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/30530587?v=4?s=100\" width=\"100px;\" alt=\"Praveen K B\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ePraveen K B\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-praveen5959\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"https://github.com/balazsbotond/urlcat/commits?author=praveen5959\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/sakshi2912\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/51375116?v=4?s=100\" width=\"100px;\" alt=\"Sakshi Vattikuti\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSakshi Vattikuti\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/balazsbotond/urlcat/commits?author=sakshi2912\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/SimonJang\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/10977475?v=4?s=100\" width=\"100px;\" alt=\"Simon Jang\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSimon Jang\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-SimonJang\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"https://github.com/balazsbotond/urlcat/commits?author=SimonJang\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://www.linkedin.com/in/tiago-santos-da-silva-328a63ba/\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/10531605?v=4?s=100\" width=\"100px;\" alt=\"Tiago Santos Da Silva\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eTiago Santos Da Silva\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/balazsbotond/urlcat/commits?author=tiago154\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://tom.carrio.me\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/8659099?v=4?s=100\" width=\"100px;\" alt=\"Tom\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eTom\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/balazsbotond/urlcat/commits?author=tcarrio\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#infra-tcarrio\" title=\"Infrastructure (Hosting, Build-Tools, etc)\"\u003e🚇\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://llll-ll.com\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/3541096?v=4?s=100\" width=\"100px;\" alt=\"kako-jun\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ekako-jun\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/balazsbotond/urlcat/issues?q=author%3Akako-jun\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"#ideas-kako-jun\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbalazsbotond%2Furlcat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbalazsbotond%2Furlcat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbalazsbotond%2Furlcat/lists"}