{"id":19880647,"url":"https://github.com/emzi0767/slimget","last_synced_at":"2026-02-27T01:31:28.203Z","repository":{"id":124526483,"uuid":"194454381","full_name":"Emzi0767/SlimGet","owner":"Emzi0767","description":"Slim, lightweight, Docker-friendly implementation of a NuGet and symbol server, using ASP.NET Core","archived":false,"fork":false,"pushed_at":"2024-05-09T15:32:52.000Z","size":2588,"stargazers_count":40,"open_issues_count":6,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-27T17:50:23.272Z","etag":null,"topics":["aspnet-core","aspnetcore","docker","dotnet-core","netcore","nuget","nuget-server"],"latest_commit_sha":null,"homepage":"https://nuget.emzi0767.com/","language":"C#","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/Emzi0767.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.TXT","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,"zenodo":null}},"created_at":"2019-06-29T22:45:33.000Z","updated_at":"2025-01-22T16:19:51.000Z","dependencies_parsed_at":null,"dependency_job_id":"8256e701-71f4-4283-ab34-af91da6bd942","html_url":"https://github.com/Emzi0767/SlimGet","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/Emzi0767/SlimGet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Emzi0767%2FSlimGet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Emzi0767%2FSlimGet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Emzi0767%2FSlimGet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Emzi0767%2FSlimGet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Emzi0767","download_url":"https://codeload.github.com/Emzi0767/SlimGet/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Emzi0767%2FSlimGet/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29880700,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-26T23:51:21.483Z","status":"ssl_error","status_checked_at":"2026-02-26T23:50:46.793Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aspnet-core","aspnetcore","docker","dotnet-core","netcore","nuget","nuget-server"],"created_at":"2024-11-12T17:12:07.757Z","updated_at":"2026-02-27T01:31:28.186Z","avatar_url":"https://github.com/Emzi0767.png","language":"C#","funding_links":["https://paypal.me/Emzi0767/5USD","https://ko-fi.com/emzi0767","https://patreon.com/emzi0767"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\u003cimg src=\"logo/slimget-logo.png\" width=\"240\" height=\"240\"\u003e\u003c/p\u003e\n\u003ch1 align=\"center\"\u003eSlimGet\u003c/h1\u003e\n\nSlimGet is a lightweight implementation of a NuGet and symbol server, powered by ASP.NET Core 2.2, designed to be ran\nin Docker. It's the software powering my NuGet feed at [nuget.emzi0767.com](https://nuget.emzi0767.com/).\n\nUnlike alternative implementations, SlimGet is designed to host a single, local feed, with no upstream mirrors or\nsimilar functionality. It's designed only with .NET packages (and debug symbols) in mind, and is therefore not\nguaranteed to work with anything else (e.g. COM interop, native libraries, etc.).\n\nThe project was born out of need for a NuGet feed for CI artifacts of my projects, after my usual go-to provider\nceased responding to all my support emails, and broke my builds in the process.\n\nThe web interface provides a simple, readonly view of the feed, which allows for browsing and downloading hosted\npackages, as well as viewing various metadata about them.\n\nProvided are tools, which allow for issuing and revoking API tokens, allowing users to upload packages, as well as\nmanage packages in a limited fashion.\n\nIn the future, I might provide more integrated means of managing users and packages.\n\n## Requirements\nIn order to run a SlimGet server, you need the following components installed and available on your system:\n- .NET Core 2.2 runtime with ASP.NET Core installed\n- PostgreSQL server 10 or better, with pg_trgm extension available\n- Redis server\n\n## Usage\nThe application is very easy and straightforward to set up, and complete guide is below. Before you begin, rename\n`slimget.example.json` to `slimget.json` and open it in your favourite text editor.\n\n### PostgreSQL Database\nThe application requires pre-made database with pg_trgm extension created, and a user to connect as. This is all fairly\neasy to set up.\n\n1. Connect to your PostgreSQL instance as the superuser (usually `postgres`) user. If you're unsure how to do it on\n   your machine, consult PostgreSQL documentation for your operating system or distribution.\n2. Create a user for the application: `create user slimget with nocreatedb nocreaterole encrypted password 'hunter2';`.\n   Of course, replace `hunter2` with your desired password. Do not remove the quotes. You can also optionally replace\n   `slimget` with your desired username. If you don't have an idea for a password, you can generate one on Linux using\n   `dd if=/dev/random bs=1024 count=1 2\u003e/dev/null | sha256sum - | cut -d' ' -f1`.\n3. Create a database for the user: `create database slimget with owner='slimget';`. Again, you can replace `slimget`\n   (the database name) with anything your heart desires, so long as it's a valid database name. If you changed the\n   username in step 2, make sure to replace the owner name (`slimget`, the one in quotes) with the username you chose.\n4. Connect to the newly-created database: `\\c slimget`. If you changed the database name in step 3, replace `slimget`\n   accordingly.\n5. Create the pg_trgm extension: `create extension pg_trgm`.\n6. Disconnect: `\\q`.\n\nAt this point, you should switch to the editor with your SlimGet configuration, and edit the values in\n`Storage.PostgreSQL` section accordingly. Below are the explanations of the various configuration options:\n\n- `Hostname`: The hostname of your PostgreSQL server. If you're running locally, use `\"localhost\"`. Bear in mind that\n  this requires the server to be listening over TCP/IP sockets. If you're unsure how to enable TCP/IP listening, check\n  out these documentation pages:\n  - [19.3.1. Connection Settings](https://www.postgresql.org/docs/current/runtime-config-connection.html#RUNTIME-CONFIG-CONNECTION-SETTINGS) -\n    this page describes the configuration options in postgresql.conf (main configuration file) related to TCP/IP\n    connections.\n  - [20.1. pg_hba.conf file](https://www.postgresql.org/docs/current/auth-pg-hba-conf.html) - this page describes\n    configuring authentication and connection options for users and clients.\n- `Port`: The TCP port, on which the PostgreSQL server is listening.\n- `Database`: The name of the database to connect to. If you did change the database name in step 3, replace\n  `\"slimget\"` with the name you chose (remember about quotation marks).\n- `Username`: The username you chose in step 2. If you did change the username, replace `\"slimget\"` with the name you\n  chose (again, remember the quotation marks).\n- `Password`: The password you chose in step 2, wrapped in quotation marks.\n- `UseSsl`: If your server encrypts connections using SSL/TLS, set this to `true`, if you're unsure, or server does\n  not offer encryption, set this to `false`. If you want to enable SSL/TLS on your server, check out the documentation\n  on the subject:\n  - [18.9. Secure TCP/IP Connections with SSL](https://www.postgresql.org/docs/current/ssl-tcp.html)\n- `AlwaysTrustServerCertificate`: Whether the client should trust the server certificate unconditionally. This disables\n  SSL certificate verification when connecting to your PostgreSQL server. If you're using a self-signed certificate,\n  set this to `true`, otherwise it's strongly recommended you set this to `false`. This option has no effect if SSL is\n  disabled.\n\n### Redis\nRedis does not require any setup on the server itself. Simply edit the values in `Storage.Redis` accordingly. Below are\nexplanations of the various options:\n\n- `Hostname`: The hostname of your Redis server. If you're running locally, use `\"localhost\"`.\n- `Port`: The TCP port your Redis server is listening on.\n- `Index`: Database index to use for SlimGet. You can change this so that SlimGet does not interfere with other\n  services that use Redis.\n- `Password`: The password for your Redis server. If your server does not require a password, set this to `null`\n  (without quotation marks). For more information, consult Redis documentation:\n  - [Redis Security](https://redis.io/topics/security)\n- `UseSsl`: If your Redis server encrypts connections using SSL/TLS, set this to `true`. Otherwise, set this to\n  `false`.\n\n### File system and package storage\nThese settings control various aspects of the actual package for your feed. Explanations for the various options are\nbelow:\n\n- `FileSystem`: Contains options pertaining to physical storage.\n  - `StoragePath`: The path where pushed packages, symbols, and manifests will be stored. This should be an absolute\n    path.\n- `Packages`: Controls various aspects of the packages hosted in the feed.\n  - `EnablePruning`: If enabled (set to `true`), your server will limit how many distinct versions of each package will\n    be hosted at any given time. This is useful for restricting storage space.\n  - `LatestVersionRetainCount`: Number of distinct package versions to retain. If pruning is enabled, this must be set\n    to a positive number, which will define how many most recent package versions to retain. Any package versions over\n    this limit will be deleted, starting with the oldest versions.\n  - `MaxPackageSizeBytes`: Maximum size of an individual package upload, in bytes. Any packages that exceed this size\n    will be rejected.\n  - `DeleteEndpointUnlists`: Controls the behaviour of the package delete (DELETE /api/v2/package/{id}/{version})\n    endpoint. If this option is set to `false`, calling this endpoint with a valid ID, version, and token will delete\n    the requested package version completely. If set to `true`, the package version will simply become unlisted.\n  - `ReadOnlyFeed`: Controls whether the feed is read-only. Setting this to `true` will disable package push, delete,\n    relist, as well as debug symbol push endpoints.\n  - `SymbolsEnabled`: Controls whether this feed should support hosting and pushing debug symbols. Setting this to\n    `false` will disable debug symbol push and download endpoints.\n\n### Server\nServer section contains various options pertaining to the HTTP stack of SlimGet. These options are explained below:\n\n- `SslCertificate`: Configures the location and password for the certificate. The certificate needs to be in PKCS12\n  (usually .pfx or .p12) format, and needs to be protected with a non-empty password. See the certificate subsection\n  for more details and information on how to generate a self-signed certificate for use with SlimGet.\n  - `Location`: Full path to the certificate file. If set to `null`, HTTPS will be disabled, and SlimGet will only work\n    over plain, unencrypted HTTP.\n  - `PasswordFile`: Full path to the file containing the password to the certificate. Bear in mind that this file will\n    be read verbatim, including all whitespace characters.\n- `Listen`: List of endpoints which SlimGet will bind to, in order to listen for HTTP(S) connections.\n  - `IpAddress`: IP address to listen on. Use `\"0.0.0.0\"` to listen on all available interfaces and\n    addresses.\n  - `Port`: TCP port number to listen on.\n  - `UseSsl`: Whether this endpoint uses HTTPS. Setting this to `true` will enable HTTPS for this endpoint.\n- `MaxRequestSizeBytes`: Maximum HTTP request size, in bytes. This should be greater than or equal to the value of\n  `Storage.Packages.MaxPackageSizeBytes`.\n- `TokenHmacKey`: Password to use for generating all API tokens. This value should be kept secret. If you're unsure\n  about a good password, you can use `dd if=/dev/random bs=1024 count=1 2\u003e/dev/null | sha256sum - | cut -d' ' -f1` on\n  a Linux system to generate one.\n\n#### SSL certificates\nSlimGet can use any certificate for SSL, be it self-signed or proper CA-issued one. If you need to generate a\nself-signed certificate, you can use the following commands to do so:\n\n```bash\necho -n \"/C=US/ST=DC/L=Washington, D.C./O=White House/OU=NuGet Hosting/CN=nuget.example.com\" \u003e subject.txt\necho -n \"hunter2\" \u003e certificate.pfx.pwd # replace hunter2 with your password, or...\n# if you have no idea for a password, you can also do this\necho -n $(dd if=/dev/random bs=1024 count=1 2\u003e/dev/null | sha256sum - | cut -d' ' -f1) \u003e certificate.pfx.pwd\n\nopenssl req -x509 -days 3650 -subj \"$(cat subject.txt)\" -newkey rsa:4096 -keyout certificate-key.pem -out certificate.pem -nodes\nopenssl pkcs12 -export -in certificate.pem -inkey certificate-key.pem -out certificate.pfx -password \"pass:$(cat certificate.pfx.pwd)\"\nrm certificate-key.pem certificate.pem subject.txt\n```\n\nYour certificate will be saved as `certificate.pfx`, and its password as `certificate.pfx.pwd`. Copy them somewhere\nyour server can access (perferably a secure medium, such as an encrypted filesystem).\n\n### Docker\nYou can run SlimGet as a Docker container. For this purpose, a [prebuilt image](https://hub.docker.com/r/emzi0767/slimget)\nis provided, allowing you to easily set up and deploy a SlimGet server. The image is `emzi0767/slimget:latest`. It\nrequires that you bind mount a directory for the packages, as well as the config file, and point the file via\nSLIMGET_CONFIGURATION_FILE environment variable.\n\nFor example, to run SlimGet as a regular container, using `/app/feed` as the package storage location, and\n`/app/slimget.json` mounted from `/mnt/slimget` as the config location, and certificate located in\n`/app/certificates` mounted from `/mnt/slimget/certificates`:\n\n```bash\ndocker run \\\n    --detach \\\n    --name slimget \\\n    --hostname slimget \\\n    --mount type=bind,src=/mnt/slimget/feed,dst=/app/feed \\\n    --mount type=bind,src=/mnt/slimget/certificates,dst=/app/certificates,readonly \\\n    --mount type=bind,src=/mnt/slimget/slimget.json,dst=/app/slimget.json,readonly \\\n    --env SLIMGET_CONFIGURATION_FILE=/app/slimget.json \\\n    --expose 443:5000 \\\n    --restart=always \\\n    emzi0767/slimget:latest\n```\n\nAbove requires `Server.SslCertificate.Location` set to `\"/app/certificates/certificate.pfx\"` and\n`Server.SslCertificate.PasswordFile` set to `\"/app/certificates/certificate.pfx.pwd\"` (assuming the corresponding files\nare named like that), as well as `Storage.FileSystem.StoragePath` set to `\"/app/feed\"`.\n\nYou can also run SlimGet as a docker service, for example, using similar settings as above, except we use a docker\nsecret called `slimget-config` to host configuration, `slimget-certificate` to host the certificate, and\n`slimget-certificate-password` to host certificate password, and attach the service to a network called\n`service-overlay`:\n\n```bash\ndocker service create \\\n    --replicas 1 \\\n    --name slimget \\\n    --mount type=bind,src=/mnt/slimget/feed,dst=/app/feed \\\n    --secret slimget-certificate \\\n    --secret slimget-certificate-password \\\n    --secret slimget-config \\\n    --env SLIMGET_CONFIGURATION_FILE=/run/secrets/slimget-config \\\n    --network service-overlay \\\n    --publish 443:5000 \\\n    emzi0767/slimget:latest\n```\n\nIn this case, `Server.SslCertificate.Location` must be set to `\"/run/secrets/slimget-certificate\"`,\n`Server.SslCertificate.PasswordFile` must be set to `\"/run/secrets/slimget-certificate-password\"`, and\n`Storage.FileSystem.StoragePath` must be set to `\"/app/feed\"`.\n\nIt is possible to use Docker volumes instead of bind mounts for the feed storage. To use a volume called slimget-feed, \nsimply replace `--mount type=bind,src=/mnt/slimget/feed,dst=/app/feed` with\n`--mount type=volume,src=slimget-feed,dst=/app/feed`.\n\nFor more information about these subjects, refer to Docker documentation:\n\n- [docker run](https://docs.docker.com/engine/reference/commandline/run/) - starts a container from given image.\n- [docker service create](https://docs.docker.com/engine/reference/commandline/service_create/) - starts a service in\n  swarm mode.\n- [Manage sensisitve data with Docker secrets](https://docs.docker.com/engine/swarm/secrets/) - information about\n  managing and using Docker secrets (available in swarm mode only).\n- [Use volumes](https://docs.docker.com/storage/volumes/) - infromation about creating, managing, and using Docker\n  volumes as means of persistent storage.\n- [Use overlay networks](https://docs.docker.com/network/overlay/) - specifically the [Create overlay network](https://docs.docker.com/network/overlay/#create-an-overlay-network) \n  section, for communicating between services in a Docker swarm.\n\n#### Building Docker image\nIf you wish to build a SlimGet Docker image yourself, you can do so by doing `docker build .\n--tag=emzi0767/slimget:latest` from the repository's root.\n\n### Issuing tokens\nAt this point, your SlimGet instance is already up and running. However, you will find that you cannot push any\npackages or symbols to the feed, because you have no credentials to do so.\n\nSlimGet comes with a simple CLI utility to manage users and tokens. It's pretty self-explanatory, and straightforward\nto use. To view full usage instructions, invoke `dotnet SlimGet.TokenManager.dll`, and it will print out all the\noptions available, with explanations.\n\nTo start using the feed, you need to first create a user, and issue a token for them. The CLI is located in the same\ndirectory as SlimGet itself. To get started, create a new user:\n\n```bash\ndotnet SlimGet.TokenManager.dll user create slimget-user slimget-user@example.com\n```\n\nReplace `slimget-user` with your desired username, and `slimget-user@example.com` with your email address. Currently,\nemail addresses are not used for communication, but only identification. The email needs to be a valid address, but\ndoes not necessarily need to exist.\n\nNow that you have a user, you need to issue an API token for said user. This is done like so:\n\n```bash\ndotnet SlimGet.TokenManager.dll token issue slimget-user\n```\n\nReplace `slimget-user` with your chosen username from the previous step. The command will create a token, and return\nit. It will look like this:\n`3a337a10785745259adc34c534a0eea81fd00bc21cdd1d3e20044ea20a59bac1a2905786670307720e0d8203bbd7d967`.\n\nNow you should note this token down somewhere, because you will be using it with your feed. You can also save it using\nNuGet CLI, by performing the following command:\n\n```bash\nnuget setApiKey -Source https://nuget.example.com/api/v3/index.json YourApiKey\n# if using debug symbol hosting\nnuget setApiKey -Source https://nuget.example.com/api/v2/symbolpackage YourApiKey\n```\n\nReplace `https://nuget.example.com` with your server's URL, and `YourApiKey` with your API key obtained above.\nPerforming this will remove the necessity to supply the API key to the `push` command via `-apiKey` switch.\n\n#### Docker\nIf your SlimGet instance is running in Docker, using the official image, you can also use the CLI to manage users and\ntokens. The CLI needs to be invoked via `docker exec`, command, like so:\n\n- View CLI usage instructions:\n  ```bash\n  docker exec -it slimget dotnet SlimGet.TokenManager.dll\n  ```\n- Create a new user\n  ```bash\n  docker exec -it slimget dotnet SlimGet.TokenManager.dll user create slimget-user slimget-user@example.com\n  ```\n- Issue a new token\n  ```bash\n  docker exec -it slimget dotnet SlimGet.TokenManager.dll token issue slimget-user\n  ```\n\nIf your container is not named `slimget`, or is running as a Docker swarm service, you can use the following command\nto find your container ID and name:\n\n```bash\ndocker ps --filter \"ancestor=emzi0767/slimget:latest\" --format '{{.ID}} | {{.Names}}'\n```\n\nThen substitute `slimget` for the name you got as the output from above command.\n\n### Pushing packages and symbols\nYou should be ready to push packages to your feed now. The complete instructions on doing so are provided by SlimGet\nitself. To view them, simply navigate to `https://nuget.example.com/gallery/about` (substituting\n`https://nuget.example.com` for your server's URL).\n\n### Consuming packages and symbols\nAfter publishing packages to your feed, you can consume them in Visual Studio, or any other NuGet client. To do so, add\nthe `https://nuget.example.com/api/v3/index.json` (substituting `https://nuget.example.com` for your server's URL) to\nyour NuGet package sources.\n\nIf you enabled debug symbol server, you can consume uploaded debug symbols as well. To do so, add\n`https://nuget.example.com/api/v3/symbolstore` (substituting `https://nuget.example.com` for your server's URL) to your\ndebug symbol sources, and enable it.\n\n## Building\nBuilding SlimGet is a very straightforward process. There's a single dependency for building, the .NET Core SDK,\navailable from the following links:\n\n- [Windows 64-bit](https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-2.2.300-windows-x64-installer)\n- [Linux](https://dotnet.microsoft.com/download/linux-package-manager/debian9/sdk-current) - you will need to choose\n  your distribution from the Linux Distribution dropdown on the page\n- [OS X](https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-2.2.300-macos-x64-installer)\n\nBeyond that, it is advisable to have a good IDE or text editor available. For Windows, I recommend\n[Visual Studio 2019](https://visualstudio.microsoft.com/vs/) or newer. The Community edition is free to download and\nuse. On other platforms, I recommend [Visual Studio Code](https://code.visualstudio.com/Download).\n\nTo start, you should clone this repository to your machine.\n\n### Building from CLI\nBuilding from the CLI is a very straightforward procedure. Simply navigate to the directory you cloned SlimGet source\nto, and execute this command:\n\n```bash\ndotnet publish -c Release -f netcoreapp2.2 -o slimget-publish\n```\n\nAfter the project is done building, your SlimGet build will be available in `slimget-publish` directory, in the\ndirectory you cloned SlimGet source code to.\n\nIf you want to build for a specific platform (e.g. Linux, Windows), you can specify a runtime identifier during build.\nSome of the most common platform examples are:\n\n- Linux x64 (Glibc-based; most Linux distributions)\n  ```bash\n  dotnet publish -c Release -f netcoreapp2.2 -r linux-x64 -o slimget-publish\n  ```\n- Linux x64 (musl-based; Alpine Linux, etc.)\n  ```bash\n  dotnet publish -c Release -f netcoreapp2.2 -r linux-musl-x64 -o slimget-publish\n  ```\n- Windows x64\n  ```bash\n  dotnet publish -c Release -f netcoreapp2.2 -r win-x64 -o slimget-publish\n  ```\n\nThis will create a standalone build, which does not require ASP.NET Core runtime to be available on the target system.\nSuch a build will be runnable using `SlimGet.exe` (and `SlimGet.TokenManager.exe`) on Windows, `./SlimGet` (and\n`./SlimGet.TokenManager`) on Linux, etc.\n\nTo read more about available Runtime Identifiers for .NET Core, refer to [Microsoft's documentation on the subject](https://docs.microsoft.com/en-us/dotnet/core/rid-catalog).\n\n### Building in Visual Studio on Windows\nBuilding in Visual Studio is also possible, with a couple of clicks. Simply open `SlimGet.sln` in Visual Studio. from\nthe menu bar on top, select Build -\u003e Rebuild Solution.\n\nBut this is not a full build yet. In order to get a working application, you must publish the artifacts. In the\nSolution Explorer pane, find the `SlimGet` project (not solution), right-click it, and select Publish from the menu.\n\nThis will open a Publish tab, titled SlimGet. There's a dropdown menu on it, and next to it is a Publish button. Select\nPublish-Portable profile from the menu, then click Publish button.\n\nNext, you need to repeat the procedure for the `SlimGet.TokenManager` project. Once you're done, your artifacts will be\navailable in the `slimget-publish` directory, in the directory you cloned SlimGet source code to.\n\n### Building in Visual Studio Code\nSlimGet provides build and launch configurations for Visual Studio Code. In order to build using VSCode, open the\ndirectory you cloned SlimGet source code to, then hit Ctrl+Shift+B (or your configured build keyboard shortcut), and\nselect `publish-slimget` from the command palette. Then hit Ctrl+Shift+B (or proper shortcut) again, and select\n`publish-tokenmanager`.\n\nAfter both builds complete, your artifacts will be available in the `slimget-publish` directory, in the directory you\ncloned SlimGet source code to.\n\n## Support me\nLots of effort went into making this, and sometimes even related software.\n\nIf you feel like I'm doing a good job, or just want to throw money at me, you can do so through any of the following:\n- [PayPal](https://paypal.me/Emzi0767/5USD)\n- [Ko-Fi](https://ko-fi.com/emzi0767)\n- [Patreon](https://patreon.com/emzi0767)\n\n## Other questions\nIf you have other questions or would like to talk in general, feel free to visit my Discord server.\n\n[![Emzi's Central Dispatch](https://discordapp.com/api/guilds/207879549394878464/embed.png?style=banner1)](https://discord.gg/rGKrJDR)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femzi0767%2Fslimget","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Femzi0767%2Fslimget","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femzi0767%2Fslimget/lists"}