{"id":10305,"date":"2024-10-22T14:27:42","date_gmt":"2024-10-22T12:27:42","guid":{"rendered":"https:\/\/via-internet.de\/blog\/?p=10305"},"modified":"2024-10-30T14:21:50","modified_gmt":"2024-10-30T13:21:50","slug":"uv-the-new-python-package-manager","status":"publish","type":"post","link":"https:\/\/via-internet.de\/blog\/2024\/10\/22\/uv-the-new-python-package-manager\/","title":{"rendered":"uv &#8211; The new Python Package Manager"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">A Developer&#8217;s Guide to Simplifying Environment Management<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">As developers, managing virtual environments is a crucial part of our workflow. With Python projects constantly shifting between dependencies and Python versions, using tools that streamline this process is key. Enter <strong><code>uv<\/code><\/strong>: a tool designed to simplify the creation, activation, and management of virtual environments and to manage python packages and projects.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this post, I\u2019ll introduce you to <code>uv<\/code>, walk you through its installation, and provide some tips to help you get started.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What is <code>uv<\/code>?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code><a href=\"https:\/\/docs.astral.sh\/uv\/\">uv<\/a><\/code> is an extremely fast Python package and project manager, written in Rust. It is a powerful tool that allows developers to manage Python virtual environments effortlessly. It provides functionality to create, activate, and switch between virtual environments in a standardized way. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By using <code>uv<\/code>, you can ensure that your virtual environments are consistently created and activated across different projects without the need to manually deal with multiple commands.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why Use <code>uv<\/code>?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Managing Python projects often involves juggling various dependencies, versions, and configurations. Without proper tooling, this can become a headache. <strong><code>uv<\/code><\/strong> helps by:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Standardizing virtual environments<\/strong> across projects, ensuring consistency.<\/li>\n\n\n\n<li><strong>Simplifying project setup<\/strong>, requiring fewer manual steps to get your environment ready.<\/li>\n\n\n\n<li><strong>Minimizing errors<\/strong> by automating activation and management of virtual environments.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Hint<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In our examples, before each command you will see our shell prompt:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f <\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#8217;t type the \u276f when you enter the command. So, when seeing<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f  uv init<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">just type<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">uv init<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In addition, when we activate the virtual environment, you will see a changed prompt:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u2726 \u276f <\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Installation and Setup<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Getting started with <code>uv<\/code> is easy. Below are the steps for installing and setting up <code>uv<\/code> for your Python projects.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Install <code>uv<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">With MacOS or Linux, you can install uv from the website:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f curl -LsSf https:\/\/astral.sh\/uv\/install.sh | sh<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Alternatively, you can install <code>uv<\/code> using <code>pip<\/code>. You\u2019ll need to have <strong>Python 3.8+<\/strong> installed on your system.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f pip install uv<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. Create a New Virtual Environment<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Once installed, you can use <code>uv<\/code> to create a virtual environment for your project. Simply navigate to your project directory and run:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f uv new<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This command will create a new virtual environment inside the <code>.venv<\/code> folder within your project.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Activate the Virtual Environment<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">After creating the virtual environment, you can easily activate it using the following command:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">uv activate<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">No need to worry about different activation scripts for Windows, Linux, or macOS. <code>uv<\/code> handles that for you.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Install Your Dependencies<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Once the environment is active, you can install your project&#8217;s dependencies as you normally would:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f pip install -r requirements.txt<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>uv<\/code> ensures that your dependencies are installed in the correct environment without any extra hassle.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can also switch to a <code>pyproject.toml<\/code> file to manage your dependencies.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First you have to initialize the project:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f uv init<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then, add the dependency:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f uv add requests<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Tips with virtual environments<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When you create a virtual environment, the corresponding folder should be in your PATH.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Normally this is <code>.venv\/bin<\/code>, when you create it with <code>uv init<\/code>. This path is added to your $PATH variable when you run <code>uv activate.<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But, if you want to choose a different folder, you must set the variable UV_PROJECT_ENVIRONMENT to this path:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f mkdir playground\n\u276f cd playground\n\u276f \/usr\/local\/bin\/python3.12 -m venv .venv\/python\/3.12\n\u276f . .venv\/python\/3.12\/bin\/activate\n\n\u2726 \u276f which python\n...\/Playground\/.venv\/python\/3.12\/bin\/python\n\n\u2726 \u276f export UV_PROJECT_ENVIRONMENT=$PWD\/.venv\/python\/3.12<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u2726 \u276f pip install uv\nCollecting uv\n  Downloading uv-0.4.25-py3-none-macosx_10_12_x86_64.whl.metadata (11 kB)\nDownloading uv-0.4.25-py3-none-macosx_10_12_x86_64.whl (13.2 MB)\n   \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 13.2\/13.2 MB 16.5 MB\/s eta 0:00:00\nInstalling collected packages: uv\nSuccessfully installed uv-0.4.25\n\n\u2726 \u276f which uv\n...\/Playground\/.venv\/python\/3.12\/bin\/uv<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u2726 \u276f uv init\nInitialized project `playground`<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">So, with the default settings, you will get an error because uv is searching the virtual environment in .venv.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u2726 \u276f uv add requests\nwarning: `VIRTUAL_ENV=.venv\/python\/3.12` does not match the project environment path `...\/.venv\/python\/3.12` and will be ignored<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Use the environment variable to tell uv where the virtual environment is installed.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u2726 \u276f export UV_PROJECT_ENVIRONMENT=$PWD\/.venv\/python\/3.12\n\n\u2726 \u276f uv add requests\nResolved 6 packages in 0.42ms\nInstalled 5 packages in 8ms\n + certifi==2024.8.30\n + charset-normalizer==3.4.0\n + idna==3.10\n + requests==2.32.3\n + urllib3==2.2.3<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Tip<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use <code>direnv<\/code> to automatically set your environment:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Install direnv: <a href=\"https:\/\/direnv.net\/docs\/installation.html\">https:\/\/direnv.net\/docs\/installation.html<\/a><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Set <code>.envrc <\/code>file:<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u2726 \u276f . .venv\/python\/3.12\/bin\/activate\n\u2726 \u276f export UV_PROJECT_ENVIRONMENT=$PWD\/.venv\/python\/3.12<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Allow the .envrc file:<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u2726 \u276f direnv allow<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Common <code>uv<\/code> Commands<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Here are a few more useful <code>uv<\/code> commands to keep in mind:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Deactivate the environment<\/strong>: <code>uv deactivate<\/code><\/li>\n\n\n\n<li><strong>Remove the environment<\/strong>: <code>uv remove<\/code><\/li>\n\n\n\n<li><strong>List available virtual environments<\/strong> in your project: <code>uv list<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Tips for Using <code>uv<\/code> Effectively<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Consistent Environment Names<\/strong>: By default, <code>uv<\/code> uses <code>.venv<\/code> as the folder name for virtual environments. Stick to this default to keep things consistent across your projects.<\/li>\n\n\n\n<li><strong>Integrate <code>uv<\/code> into your CI\/CD pipeline<\/strong>: Ensure that your automated build tools use the same virtual environment setup by adding <code>uv<\/code> commands to your pipeline scripts.<\/li>\n\n\n\n<li><strong>Use <code>uv<\/code> in combination with <code>pyproject.toml<\/code><\/strong>: If your project uses <code>pyproject.toml<\/code> for dependency management, <code>uv<\/code> can seamlessly integrate, ensuring your environment is always up to date.<\/li>\n\n\n\n<li><strong>Quick Switching<\/strong>: If you manage multiple Python projects, <code>uv<\/code>&#8216;s environment activation and deactivation commands make it easy to switch between projects without worrying about which virtual environment is currently active.<\/li>\n\n\n\n<li><strong>Automate Activation<\/strong>: Combine <code>uv<\/code> with <code>direnv<\/code> or add an activation hook in your shell to automatically activate the correct environment when you enter a project folder.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Cheatsheet<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\"><code>uv<\/code> Command Cheatsheet<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">General Commands<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><code>uv new<\/code><\/td><td>Creates a new virtual environment in the <code>.venv<\/code> directory.<\/td><\/tr><tr><td><code>uv activate<\/code><\/td><td>Activates the virtual environment.<\/td><\/tr><tr><td><code>uv deactivate<\/code><\/td><td>Deactivates the active virtual environment.<\/td><\/tr><tr><td><code>uv remove<\/code><\/td><td>Removes the virtual environment in the project.<\/td><\/tr><tr><td><code>uv list<\/code><\/td><td>Lists all available virtual environments in the project.<\/td><\/tr><tr><td><code>uv install<\/code><\/td><td>Installs dependencies from <code>requirements.txt<\/code> or <code>pyproject.toml<\/code>.<\/td><\/tr><tr><td><code>uv pip [pip-command]<\/code><\/td><td>Runs a pip command within the virtual environment.<\/td><\/tr><tr><td><code>uv python [python-command]<\/code><\/td><td>Runs a Python command within the virtual environment.<\/td><\/tr><tr><td><code>uv shell<\/code><\/td><td>Starts a new shell session with the virtual environment active.<\/td><\/tr><tr><td><code>uv status<\/code><\/td><td>Shows the status of the current virtual environment.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Working with Dependencies<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><code>uv pip install [package]<\/code><\/td><td>Installs a Python package in the active environment.<\/td><\/tr><tr><td><code>uv pip uninstall [package]<\/code><\/td><td>Uninstalls a Python package from the environment.<\/td><\/tr><tr><td><code>uv pip freeze<\/code><\/td><td>Outputs a list of installed packages and their versions.<\/td><\/tr><tr><td><code>uv pip list<\/code><\/td><td>Lists all installed packages in the environment.<\/td><\/tr><tr><td><code>uv pip show [package]<\/code><\/td><td>Shows details about a specific installed package.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Environment Management<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><code>uv activate<\/code><\/td><td>Activates the virtual environment.<\/td><\/tr><tr><td><code>uv deactivate<\/code><\/td><td>Deactivates the active environment.<\/td><\/tr><tr><td><code>uv remove<\/code><\/td><td>Deletes the current virtual environment.<\/td><\/tr><tr><td><code>uv list<\/code><\/td><td>Lists all virtual environments in the project.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Cleanup and Miscellaneous<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><code>uv clean<\/code><\/td><td>Removes all <code>.pyc<\/code> and cache files from the project.<\/td><\/tr><tr><td><code>uv upgrade<\/code><\/td><td>Upgrades <code>uv<\/code> itself to the latest version.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Using Python and Pip Inside Virtual Environment<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><code>uv python<\/code><\/td><td>Runs Python within the virtual environment.<\/td><\/tr><tr><td><code>uv pip [command]<\/code><\/td><td>Runs any pip command within the virtual environment.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Helper Commands<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><code>uv status<\/code><\/td><td>Displays the current virtual environment status.<\/td><\/tr><tr><td><code>uv help<\/code><\/td><td>Displays help about available commands.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">More to read<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Here is a shot list of websites with documentation or other information about uv:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.astral.sh\/uv\">https:\/\/docs.astral.sh\/uv<\/a><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/fpgmaas\/cookiecutter-uv\">https:\/\/github.com\/fpgmaas\/cookiecutter-uv<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/a5chin\/python-uv\">https:\/\/github.com\/a5chin\/python-uv<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>An extremely fast Python package and project manager, written in Rust.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[65],"tags":[],"class_list":["post-10305","post","type-post","status-publish","format-standard","hentry","category-python"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts\/10305","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/comments?post=10305"}],"version-history":[{"count":13,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts\/10305\/revisions"}],"predecessor-version":[{"id":10329,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/posts\/10305\/revisions\/10329"}],"wp:attachment":[{"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/media?parent=10305"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/categories?post=10305"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/via-internet.de\/blog\/wp-json\/wp\/v2\/tags?post=10305"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}