{"id":13553629,"url":"https://github.com/ehmicky/autoserver","last_synced_at":"2025-04-12T14:55:31.565Z","repository":{"id":40572002,"uuid":"102602425","full_name":"ehmicky/autoserver","owner":"ehmicky","description":"Create a full-featured REST/GraphQL API from a configuration file","archived":false,"fork":false,"pushed_at":"2025-03-29T03:21:00.000Z","size":21805,"stargazers_count":205,"open_issues_count":0,"forks_count":12,"subscribers_count":11,"default_branch":"main","last_synced_at":"2025-04-02T17:06:26.112Z","etag":null,"topics":["api","baas","cli","database","deployment","es6","framework","graphql","http","javascript","json","json-rpc","library","minotoring","mongodb","nodejs","rest-api","server","serverless","yaml"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ehmicky.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2017-09-06T11:51:32.000Z","updated_at":"2025-03-29T03:21:04.000Z","dependencies_parsed_at":"2023-09-21T21:54:26.252Z","dependency_job_id":"263082fa-7ffa-4996-be82-3b1716ba5ef0","html_url":"https://github.com/ehmicky/autoserver","commit_stats":{"total_commits":5849,"total_committers":2,"mean_commits":2924.5,"dds":"0.0018806633612583612","last_synced_commit":"f36e61a4038d0d5f0e5097d5bc32c24190d1120f"},"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ehmicky%2Fautoserver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ehmicky%2Fautoserver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ehmicky%2Fautoserver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ehmicky%2Fautoserver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ehmicky","download_url":"https://codeload.github.com/ehmicky/autoserver/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248586243,"owners_count":21128995,"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":["api","baas","cli","database","deployment","es6","framework","graphql","http","javascript","json","json-rpc","library","minotoring","mongodb","nodejs","rest-api","server","serverless","yaml"],"created_at":"2024-08-01T12:02:29.892Z","updated_at":"2025-04-12T14:55:31.539Z","avatar_url":"https://github.com/ehmicky.png","language":"JavaScript","funding_links":[],"categories":["JavaScript","graphql"],"sub_categories":[],"readme":"\u003cimg alt=\"autoserver logo\" src=\"https://raw.githubusercontent.com/ehmicky/design/main/autoserver/autoserver.svg\" width=\"500\"/\u003e\n\n[![Node](https://img.shields.io/badge/-Node.js-808080?logo=node.js\u0026colorA=404040\u0026logoColor=66cc33)](https://www.npmjs.com/package/autoserver)\n[![Mastodon](https://img.shields.io/badge/-Mastodon-808080.svg?logo=mastodon\u0026colorA=404040\u0026logoColor=9590F9)](https://fosstodon.org/@ehmicky)\n[![Medium](https://img.shields.io/badge/-Medium-808080.svg?logo=medium\u0026colorA=404040)](https://medium.com/@ehmicky)\n\nCreate a full-featured REST/GraphQL API from a configuration file.\n\n# Development status\n\nThis project is still in active development, and is not ready for production.\n[Key features](docs/dev/ROADMAP.md) are currently missing.\n\nIf you want to follow our progress in the meantime, you are welcome to star this\nrepository.\n\n# Overview\n\nCreate a simple\n[configuration file](docs/server/configuration/configuration.md#configuration-file)\ndescribing your data model:\n\n```yml\nengine: 0\ncollections:\n  users:\n    description: User of the API\n    attributes:\n      id:\n        type: string\n      age:\n        type: integer\n      score:\n        type: number\n        alias: high_score\n        default: 10\n        validate:\n          minimum: 20\n      reports:\n        type: reports[]\n  reports:\n    attributes:\n      id:\n        type: string\n      content:\n        type: string\n  default:\n    database: mongodb\ndatabases:\n  mongodb:\n    hostname: localhost\n    password: secret_mongodb_password\n    dbname: my_database_name\nprotocols:\n  http:\n    port: 5001\n```\n\nThen start a full-featured web API.\n\n```bash\n$ autoserver\n```\n\nClients will now be able to perform [GraphQL](docs/client/rpc/graphql.md)\nrequests:\n\n```graphql\n{\n  find_users(\n    filter: { score: { _gt: 100 } }\n    order: \"score\"\n  ) {\n    id\n    age\n    score\n    reports: { content }\n  }\n}\n```\n\nOr [REST](docs/client/rpc/rest.md) requests:\n\n```HTTP\nGET /rest/users/?filter.score._gt=100\u0026order=score\u0026populate=reports\n```\n\n```json\n{\n  \"data\": [\n    {\n      \"id\": \"15\",\n      \"age\": 32,\n      \"score\": 150,\n      \"reports\": { \"id\": \"65\", \"content\": \"...\" }\n    },\n    {\n      \"id\": \"251\",\n      \"age\": 24,\n      \"score\": 168,\n      \"reports\": { \"id\": \"67\", \"content\": \"...\" }\n    },\n    {\n      \"id\": \"7\",\n      \"age\": 51,\n      \"score\": 192,\n      \"reports\": { \"id\": \"10\", \"content\": \"...\" }\n    }\n  ]\n}\n```\n\n# Features\n\n- [Multiple RPC systems](docs/client/rpc/README.md), including\n  [REST](docs/client/rpc/rest.md), [GraphQL](docs/client/rpc/graphql.md) and\n  [JSON-RPC](docs/client/rpc/jsonrpc.md)\n- [GraphQL debugging](docs/client/rpc/graphql.md), including introspection,\n  interactive debugger and GraphQL schema printing\n- [Multiple databases](docs/server/databases/README.md) support, including\n  [MongoDB](docs/server/databases/mongodb.md) and an\n  [in-memory database](docs/server/databases/memorydb.md). Different databases\n  can be used at the same time.\n- [Multiple protocols](docs/client/protocols/README.md) handling, with support\n  for [HTTP/1.1](docs/server/protocols/http.md) only at the moment\n- [Multiple formats](docs/client/protocols/formats.md) support for the\n  configuration files, the client request payloads and the server responses,\n  including [JSON](docs/client/protocols/formats.md#json),\n  [YAML](docs/client/protocols/formats.md#yaml),\n  [x-www-form-urlencoded](docs/client/protocols/formats.md#x-www-form-urlencoded),\n  [JavaScript](docs/server/configuration/formats.md#javascript),\n  [Hjson](docs/client/protocols/formats.md#hjson),\n  [JSON5](docs/client/protocols/formats.md#json5) and\n  [INI](docs/client/protocols/formats.md#ini)\n- automatic [logging](docs/server/quality/logging.md) and\n  [performance monitoring](docs/server/quality/logging.md#performance-monitoring)\n- extensive\n  [error handling and reporting](docs/server/usage/error.md#exceptions)\n- [CRUD commands](docs/client/request/crud.md): find, create, patch, upsert,\n  delete. Each command can be performed on a single model or on several models.\n- [Advanced mutations](docs/client/request/patch.md) like incrementing, regular\n  expression replacement, cross-attributes mutations, slicing, etc.\n- [relations, nested commands](docs/client/request/relations.md) and populating\n  between models, including for mutations\n- [filtering](docs/client/arguments/filtering.md)\n- [sorting](docs/client/arguments/sorting.md)\n- [selecting](docs/client/arguments/selecting.md)\n- [renaming attributes](docs/client/arguments/renaming.md)\n- [pagination](docs/client/arguments/pagination.md)\n- [input validation](docs/server/data_model/validation.md#data-validation)\n- [authorization](docs/server/data_model/authorization.md), including\n  [readonly](docs/server/data_model/authorization.md#readonly-attributes)\n  attributes\n- [default values](docs/server/data_model/default.md)\n- [computed attributes and normalization](docs/server/data_model/transformation.md)\n- [aliases](docs/server/data_model/compatibility.md#aliases)\n- automatic attributes:\n  [`created_time`, `updated_time`](docs/server/plugins/timestamp.md),\n  [`created_by`, `updated_by`](docs/server/plugins/author.md)\n- [compression](docs/client/arguments/compression.md) of both the response and\n  the request, for any protocol. [Brotli](https://en.wikipedia.org/wiki/Brotli)\n  support.\n- [dry runs](docs/client/arguments/dryrun.md)\n- [silent outputs](docs/client/arguments/silent.md)\n- [plugins](docs/server/plugins/README.md)\n- [custom logic](docs/server/configuration/functions.md) can be added in\n  JavaScript\n\n# Documentation\n\nThe documentation is [here](docs/README.md).\n\n# Badge\n\nThe following badge can be added to your project:\n[![autoserver](https://img.shields.io/badge/auto-server-406890.svg?logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNDU5IDQ1OSIKICAgdmlld0JveD0iMCAwIDQwNS4yMjY5OSA0MDUuMjI4IgogICBoZWlnaHQ9IjQwNS4yMjgiCiAgIHdpZHRoPSI0MDUuMjI2OTkiCiAgIHk9IjBweCIKICAgeD0iMHB4IgogICBpZD0iTGF5ZXJfMSIKICAgdmVyc2lvbj0iMS4xIj48bWV0YWRhdGEKICAgaWQ9Im1ldGFkYXRhMTA4NSI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgIHJkZjphYm91dD0iIj48ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD48ZGM6dHlwZQogICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPjxkYzp0aXRsZT48L2RjOnRpdGxlPjwvY2M6V29yaz48L3JkZjpSREY+PC9tZXRhZGF0YT48ZGVmcwogICBpZD0iZGVmczEwODMiIC8+CjxnCiAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44ODcsLTI2Ljg4NykiCiAgIGlkPSJnMTA3OCI+Cgk8cGF0aAogICBzdHlsZT0iZmlsbDojMTJhNWVhIgogICBpZD0icGF0aDEwNzQiCiAgIGQ9Im0gNDMyLjExMywyMDMuODkgLTQzLjM0OCwtMTQuNjMxIGMgLTMuOTQ0LC0xNS42NDYgLTEwLjEzNCwtMzAuMzk3IC0xOC4yMDYsLTQzLjkgTCAzOTAuODgyLDEwNC4zNDcgMzczLjI2Nyw4Ni43MyAzNzIuMjc4LDg1LjczNyAzNTQuNjU0LDY4LjEyIDMxMy42NDIsODguNDQgQyAzMDAuMTQzLDgwLjM2NyAyODUuMzkyLDc0LjE3OCAyNjkuNzQ5LDcwLjIzNyBMIDI1NS4xMSwyNi44ODcgaCAtMjQuOTExIC0xLjM5NSAtMjQuOTE0IGwgLTE0LjYyNyw0My4zNTEgYyAtMTUuNjUsMy45NDEgLTMwLjM5NywxMC4xMyAtNDMuOTA0LDE4LjIwMyBsIC00MS4wMTIsLTIwLjMyIC0xNy42MTgsMTcuNjE2IC0wLjk5MiwwLjk4OSAtMTcuNjIsMTcuNjIgMjAuMzIzLDQxLjAxMiBjIC04LjA2OSwxMy41MDMgLTE0LjI1NCwyOC4yNTQgLTE4LjE5NSw0My44OTYgTCAyNi44ODcsMjAzLjg5IHYgMjQuOTE1IDEuMzkyIDI0LjkxNSBsIDQzLjM1OCwxNC42MzUgYyAzLjk0MSwxNS42NDYgMTAuMTI2LDMwLjM5NyAxOC4xOTUsNDMuODkzIGwgLTIwLjMyMyw0MS4wMTYgMTcuNjIsMTcuNjE2IDAuOTg1LDAuOTkzIDE3LjYyNCwxNy42MiA0MS4wMTIsLTIwLjMyNCBjIDEzLjUwNyw4LjA3MyAyOC4yNTQsMTQuMjU5IDQzLjg5NiwxOC4xOTkgbCAxNC42MzUsNDMuMzU1IGggMjQuOTE1IDEuMzk1IDI0LjkxMSBsIDE0LjYzOSwtNDMuMzU1IGMgMTUuNjQzLC0zLjk0IDMwLjM5NCwtMTAuMTI2IDQzLjg5MywtMTguMTk5IGwgNDEuMDEyLDIwLjMyNCAxNy42MiwtMTcuNjIgMC45OTMsLTAuOTg1IDE3LjYxNiwtMTcuNjI0IC0yMC4zMjMsLTQxLjAxNiBjIDguMDcyLC0xMy40OTUgMTQuMjYyLC0yOC4yNDcgMTguMjA2LC00My44OTMgbCA0My4zNDgsLTE0LjYzNSBWIDIzMC4xOTcgMjI4LjgwNSAyMDMuODkgWiBNIDIyOS41MDQsMzU0LjkwNiBjIC02OS4yNTksMCAtMTI1LjQwNSwtNTYuMTQ3IC0xMjUuNDA1LC0xMjUuNDA2IDAsLTY5LjI1NSA1Ni4xNDYsLTEyNS40MDkgMTI1LjQwNSwtMTI1LjQwOSA2OS4yNTUsMCAxMjUuNDA5LDU2LjE1NCAxMjUuNDA5LDEyNS40MDkgMCw2OS4yNTkgLTU2LjE1NCwxMjUuNDA2IC0xMjUuNDA5LDEyNS40MDYgeiIgLz4KCTxwYXRoCiAgIHN0eWxlPSJjbGlwLXJ1bGU6ZXZlbm9kZDtmaWxsOiMxMmE1ZWE7ZmlsbC1ydWxlOmV2ZW5vZGQiCiAgIGlkPSJwYXRoMTA3NiIKICAgZD0ibSAzMTQuMjUyLDIxOS41MzMgYyAtNy44MzQsLTQuOTM3IC0xNS44NjYsLTkuNTkxIC0yMy44MzMsLTE0LjMxNyAtMjYuOTI0LC0xNS45NjIgLTUzLjg1OCwtMzEuOTEyIC04MC43ODIsLTQ3Ljg2IC00LjU2MSwtMi43MDUgLTkuMDgyLC01LjQ2NCAtMTMuNjg4LC04LjA3NSAtMTAuMTk0LC01Ljc1NiAtMTguMzcxLC0xLjI3IC0xOS4wMDIsMTAuMzY5IC0wLjA3MywxLjMxOSAtMC4wNzIsMi42NDggLTAuMDgyLDMuOTc2IC0wLjAwNCwwLjU4MiAtMC4wMDksMS4yMjIgLTAuMDEzLDEuODk3IHYgMTM2LjY4NSBjIDEuMzk4LDguNTIgOC44MzUsMTIuMTIyIDE3LjMxOSw3Ljc1IDEwLjE1MywtNS4yMjkgMjAuMDE4LC0xMS4wNDIgMjkuOTc5LC0xNi42NjMgMTcuMDc4LC05LjY0OSAzNC4xNDIsLTE5LjMzNSA1MS4xOTgsLTI5LjAyOSAxMi45NzQsLTcuMzggMjYuMDE5LC0xNC42MzMgMzguODUyLC0yMi4yNTYgMTAuNzkzLC02LjQyNiAxMC43NjQsLTE1Ljc0IDAuMDUyLC0yMi40NzcgeiIgLz4KPC9nPgo8L3N2Zz4=)](https://github.com/ehmicky/autoserver)\n\n```markdown\n[![autoserver](https://img.shields.io/badge/auto-server-406890.svg?logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNDU5IDQ1OSIKICAgdmlld0JveD0iMCAwIDQwNS4yMjY5OSA0MDUuMjI4IgogICBoZWlnaHQ9IjQwNS4yMjgiCiAgIHdpZHRoPSI0MDUuMjI2OTkiCiAgIHk9IjBweCIKICAgeD0iMHB4IgogICBpZD0iTGF5ZXJfMSIKICAgdmVyc2lvbj0iMS4xIj48bWV0YWRhdGEKICAgaWQ9Im1ldGFkYXRhMTA4NSI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgIHJkZjphYm91dD0iIj48ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD48ZGM6dHlwZQogICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPjxkYzp0aXRsZT48L2RjOnRpdGxlPjwvY2M6V29yaz48L3JkZjpSREY+PC9tZXRhZGF0YT48ZGVmcwogICBpZD0iZGVmczEwODMiIC8+CjxnCiAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yNi44ODcsLTI2Ljg4NykiCiAgIGlkPSJnMTA3OCI+Cgk8cGF0aAogICBzdHlsZT0iZmlsbDojMTJhNWVhIgogICBpZD0icGF0aDEwNzQiCiAgIGQ9Im0gNDMyLjExMywyMDMuODkgLTQzLjM0OCwtMTQuNjMxIGMgLTMuOTQ0LC0xNS42NDYgLTEwLjEzNCwtMzAuMzk3IC0xOC4yMDYsLTQzLjkgTCAzOTAuODgyLDEwNC4zNDcgMzczLjI2Nyw4Ni43MyAzNzIuMjc4LDg1LjczNyAzNTQuNjU0LDY4LjEyIDMxMy42NDIsODguNDQgQyAzMDAuMTQzLDgwLjM2NyAyODUuMzkyLDc0LjE3OCAyNjkuNzQ5LDcwLjIzNyBMIDI1NS4xMSwyNi44ODcgaCAtMjQuOTExIC0xLjM5NSAtMjQuOTE0IGwgLTE0LjYyNyw0My4zNTEgYyAtMTUuNjUsMy45NDEgLTMwLjM5NywxMC4xMyAtNDMuOTA0LDE4LjIwMyBsIC00MS4wMTIsLTIwLjMyIC0xNy42MTgsMTcuNjE2IC0wLjk5MiwwLjk4OSAtMTcuNjIsMTcuNjIgMjAuMzIzLDQxLjAxMiBjIC04LjA2OSwxMy41MDMgLTE0LjI1NCwyOC4yNTQgLTE4LjE5NSw0My44OTYgTCAyNi44ODcsMjAzLjg5IHYgMjQuOTE1IDEuMzkyIDI0LjkxNSBsIDQzLjM1OCwxNC42MzUgYyAzLjk0MSwxNS42NDYgMTAuMTI2LDMwLjM5NyAxOC4xOTUsNDMuODkzIGwgLTIwLjMyMyw0MS4wMTYgMTcuNjIsMTcuNjE2IDAuOTg1LDAuOTkzIDE3LjYyNCwxNy42MiA0MS4wMTIsLTIwLjMyNCBjIDEzLjUwNyw4LjA3MyAyOC4yNTQsMTQuMjU5IDQzLjg5NiwxOC4xOTkgbCAxNC42MzUsNDMuMzU1IGggMjQuOTE1IDEuMzk1IDI0LjkxMSBsIDE0LjYzOSwtNDMuMzU1IGMgMTUuNjQzLC0zLjk0IDMwLjM5NCwtMTAuMTI2IDQzLjg5MywtMTguMTk5IGwgNDEuMDEyLDIwLjMyNCAxNy42MiwtMTcuNjIgMC45OTMsLTAuOTg1IDE3LjYxNiwtMTcuNjI0IC0yMC4zMjMsLTQxLjAxNiBjIDguMDcyLC0xMy40OTUgMTQuMjYyLC0yOC4yNDcgMTguMjA2LC00My44OTMgbCA0My4zNDgsLTE0LjYzNSBWIDIzMC4xOTcgMjI4LjgwNSAyMDMuODkgWiBNIDIyOS41MDQsMzU0LjkwNiBjIC02OS4yNTksMCAtMTI1LjQwNSwtNTYuMTQ3IC0xMjUuNDA1LC0xMjUuNDA2IDAsLTY5LjI1NSA1Ni4xNDYsLTEyNS40MDkgMTI1LjQwNSwtMTI1LjQwOSA2OS4yNTUsMCAxMjUuNDA5LDU2LjE1NCAxMjUuNDA5LDEyNS40MDkgMCw2OS4yNTkgLTU2LjE1NCwxMjUuNDA2IC0xMjUuNDA5LDEyNS40MDYgeiIgLz4KCTxwYXRoCiAgIHN0eWxlPSJjbGlwLXJ1bGU6ZXZlbm9kZDtmaWxsOiMxMmE1ZWE7ZmlsbC1ydWxlOmV2ZW5vZGQiCiAgIGlkPSJwYXRoMTA3NiIKICAgZD0ibSAzMTQuMjUyLDIxOS41MzMgYyAtNy44MzQsLTQuOTM3IC0xNS44NjYsLTkuNTkxIC0yMy44MzMsLTE0LjMxNyAtMjYuOTI0LC0xNS45NjIgLTUzLjg1OCwtMzEuOTEyIC04MC43ODIsLTQ3Ljg2IC00LjU2MSwtMi43MDUgLTkuMDgyLC01LjQ2NCAtMTMuNjg4LC04LjA3NSAtMTAuMTk0LC01Ljc1NiAtMTguMzcxLC0xLjI3IC0xOS4wMDIsMTAuMzY5IC0wLjA3MywxLjMxOSAtMC4wNzIsMi42NDggLTAuMDgyLDMuOTc2IC0wLjAwNCwwLjU4MiAtMC4wMDksMS4yMjIgLTAuMDEzLDEuODk3IHYgMTM2LjY4NSBjIDEuMzk4LDguNTIgOC44MzUsMTIuMTIyIDE3LjMxOSw3Ljc1IDEwLjE1MywtNS4yMjkgMjAuMDE4LC0xMS4wNDIgMjkuOTc5LC0xNi42NjMgMTcuMDc4LC05LjY0OSAzNC4xNDIsLTE5LjMzNSA1MS4xOTgsLTI5LjAyOSAxMi45NzQsLTcuMzggMjYuMDE5LC0xNC42MzMgMzguODUyLC0yMi4yNTYgMTAuNzkzLC02LjQyNiAxMC43NjQsLTE1Ljc0IDAuMDUyLC0yMi40NzcgeiIgLz4KPC9nPgo8L3N2Zz4=)](https://github.com/ehmicky/autoserver)\n```\n\n# Contribute\n\nSee the [developer's documentation](docs/dev/README.md).\n\n# Contributors\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START --\u003e\n\u003c!-- prettier-ignore --\u003e\n\u003c!--\n\u003ctable\u003e\u003ctr\u003e\u003ctd align=\"center\"\u003e\u003ca href=\"https://fosstodon.org/@ehmicky\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/8136211?v=4\" width=\"100px;\" alt=\"ehmicky\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eehmicky\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/ehmicky/autoserver/commits?author=ehmicky\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"#design-ehmicky\" title=\"Design\"\u003e🎨\u003c/a\u003e \u003ca href=\"#ideas-ehmicky\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"https://github.com/ehmicky/autoserver/commits?author=ehmicky\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n--\u003e\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fehmicky%2Fautoserver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fehmicky%2Fautoserver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fehmicky%2Fautoserver/lists"}