{"id":3897,"date":"2025-12-24T10:00:27","date_gmt":"2025-12-24T15:00:27","guid":{"rendered":"https:\/\/www.mymiller.name\/wordpress\/?p=3897"},"modified":"2025-12-24T10:00:27","modified_gmt":"2025-12-24T15:00:27","slug":"a-beginners-guide-to-setting-up-ollama-with-docker-compose","status":"publish","type":"post","link":"https:\/\/www.mymiller.name\/wordpress\/spring_ai\/a-beginners-guide-to-setting-up-ollama-with-docker-compose\/","title":{"rendered":"A Beginner&#8217;s Guide to Setting Up Ollama with Docker Compose"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Have you ever wanted to run a powerful large language model (LLM) like Llama 3 or Gemma right on your own computer, but you need a consistent and portable setup? That&#8217;s where using Ollama with Docker and Docker Compose comes in.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Docker Compose is a fantastic tool that allows you to define and run multi-container Docker applications. By using it with Ollama, you get a clean, isolated environment that is easy to manage and replicate across different machines.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide will walk you through the process of setting up Ollama and your first model using Docker Compose.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Create Your Docker Compose Configuration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The core of this setup is a single file: <code>docker-compose.yml<\/code>. This file defines the services (containers) you want to run. You can place this file in any directory you choose.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create a new file named <code>docker-compose.yml<\/code> and add the following content.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>version: '3.8'\n\nservices:\n  ollama:\n    container_name: ollama\n    image: ollama\/ollama:latest\n    ports:\n      - \"11434:11434\"\n    volumes:\n      - ollama_data:\/root\/.ollama\n    restart: always\n\nvolumes:\n  ollama_data:\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">What this file does:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>version: '3.8'<\/code>: Specifies the Docker Compose file format version.<\/li>\n\n\n\n<li><code>services<\/code>: Defines the containers to be run.<\/li>\n\n\n\n<li><code>ollama<\/code>: This is the name of our service.<\/li>\n\n\n\n<li><code>image: ollama\/ollama:latest<\/code>: Tells Docker to use the latest official Ollama image from Docker Hub.<\/li>\n\n\n\n<li><code>ports: - \"11434:11434\"<\/code>: Maps the container&#8217;s port <code>11434<\/code> to the same port on your host machine, which is the default port for Ollama&#8217;s API.<\/li>\n\n\n\n<li><code>volumes: - ollama_data:\/root\/.ollama<\/code>: This creates a persistent volume named <code>ollama_data<\/code> to store the downloaded models. This means your models will not be deleted if the container is removed.<\/li>\n\n\n\n<li><code>restart: always<\/code>: Ensures that the container restarts automatically if it stops.<\/li>\n\n\n\n<li><code>volumes: ollama_data: <\/code>: Defines the named volume.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Start the Ollama Service<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Now, open your terminal or Command Prompt, navigate to the directory where you saved your <code>docker-compose.yml<\/code> file, and run the following command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker compose up -d\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>up<\/code>: Starts the services defined in the <code>docker-compose.yml<\/code> file.<\/li>\n\n\n\n<li><code>-d<\/code>: Runs the containers in &#8220;detached&#8221; mode, so they run in the background and don&#8217;t tie up your terminal.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Docker will now download the Ollama image and start the container. You&#8217;ll know it&#8217;s running when you get your command prompt back.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Finding and Using Pre-made Models<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ollama hosts a wide variety of pre-trained models that are ready for you to use. You can find the full library on the official website at <code>https:\/\/ollama.com\/library<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The library is a fantastic resource for exploring models based on their size, purpose, and capabilities. You&#8217;ll find popular models like Llama 3, Mistral, and Gemma, as well as specialized models for coding (<code>CodeLlama<\/code>) and image understanding (<code>LLaVA<\/code>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How to choose a model:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Check your hardware:<\/strong> LLMs are memory-intensive, especially for a GPU. A general rule of thumb is that 7B (billion parameter) models require at least 8 GB of RAM\/VRAM, 13B models need 16 GB, and larger models require even more.<\/li>\n\n\n\n<li><strong>Consider the model&#8217;s purpose:<\/strong> Look for models fine-tuned for a specific task. For general-purpose conversations, <code>Llama 3<\/code> is an excellent choice. For coding assistance, <code>CodeLlama<\/code> is highly recommended.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">How to download and run a model:<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ollama provides a simple command to download and run any model from its library. The <code>docker compose exec<\/code> command is a great way to manage models from your terminal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To download a model without running it immediately, use <code>ollama pull<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker compose exec ollama ollama pull mistral\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To download and immediately start chatting with a model, use <code>ollama run<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker compose exec ollama ollama run llama3\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If you don&#8217;t have the model already, the <code>run<\/code> command will automatically pull it for you first.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To see all the models you have downloaded, use the <code>ollama list<\/code> command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker compose exec ollama ollama list\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Next Steps and Advanced Usage<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Option 1: Executing a command inside the container<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can use <code>docker compose exec<\/code> to run commands within the container. This is a great way to manage models from your terminal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To run a popular model like Llama 3, use this command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker compose exec ollama ollama run llama3\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The first time you run this, it will download the model. After the download is complete, you can start chatting with the model directly in your terminal.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Option 2: Using the Ollama API<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Since you&#8217;ve mapped port <code>11434<\/code>, you can also interact with Ollama via its API, just as you would with a local installation. For example, you can use <code>curl<\/code> to send a request:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl http:\/\/localhost:11434\/api\/generate -d '{\n  \"model\": \"llama3\",\n  \"prompt\": \"Why is the sky blue?\"\n}'\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This method is particularly useful for integrating Ollama into applications and scripts.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Getting Started with the OpenAPI Specification<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ollama&#8217;s API is fully documented and is compatible with the OpenAPI (formerly Swagger) standard. This means you can use it with various API clients and frameworks for a seamless integration.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The OpenAPI Base URL<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">While there isn&#8217;t a single, downloadable JSON file, all of the API endpoints follow a consistent base URL.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Base URL:<\/strong> <code>http:\/\/localhost:11434\/api<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Common Endpoints<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Here are a few of the most important endpoints you&#8217;ll use:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>POST <code>\/api\/generate<\/code><\/strong>: The main endpoint for generating completions from a prompt. This is used for single-turn text generation.<\/li>\n\n\n\n<li><strong>POST <code>\/api\/chat<\/code><\/strong>: Used for multi-turn conversations, as it maintains context and conversation history.<\/li>\n\n\n\n<li><strong>GET <code>\/api\/tags<\/code><\/strong>: Retrieves a list of all models that have been downloaded and are available on your local Ollama instance.<\/li>\n\n\n\n<li><strong>POST <code>\/api\/pull<\/code><\/strong>: Used to pull (download) a new model from the Ollama library.<\/li>\n\n\n\n<li><strong>POST <code>\/api\/embeddings<\/code><\/strong>: Generates a numerical vector for a given text prompt, which is essential for Retrieval-Augmented Generation (RAG) applications.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You can find the full API reference in the official Ollama documentation, which details all the request and response body formats for each endpoint. This documentation is your key to programmatically interacting with your local Ollama instance, for example, from a Spring AI application.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 6: Enabling GPU Acceleration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Enabling GPU acceleration is a critical step for getting the best performance from your models. The method you use depends on your operating system.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">For Linux and Windows (NVIDIA GPUs)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For a significant performance boost on systems with NVIDIA GPUs, you&#8217;ll need to configure Docker Compose to grant it access. This requires the <a href=\"https:\/\/docs.nvidia.com\/datacenter\/cloud-native\/container-toolkit\/latest\/install-guide.html\">NVIDIA Container Toolkit<\/a> to be installed on your host system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once the toolkit is installed, update your <code>docker-compose.yml<\/code> to include the <code>deploy<\/code> and <code>runtime<\/code> options.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>version: '3.8'\n\nservices:\n  ollama:\n    container_name: ollama\n    image: ollama\/ollama:latest\n    ports:\n      - \"11434:11434\"\n    volumes:\n      - ollama_data:\/root\/.ollama\n    deploy:\n      resources:\n        reservations:\n          devices:\n            - driver: nvidia\n              count: all\n              capabilities: &#91;gpu]\n    runtime: nvidia\n    restart: always\n\nvolumes:\n  ollama_data:\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This configuration tells Docker to use the NVIDIA runtime and to reserve all available GPUs for the <code>ollama<\/code> container, ensuring you get the best possible performance.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">For macOS (Apple Silicon)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">On Mac, the process is much simpler. <strong>You do not need to modify the <code>docker-compose.yml<\/code> file to enable GPU access.<\/strong> The official Ollama application for macOS is built to use Apple&#8217;s Metal Performance Shaders (MPS) for acceleration by default.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This means if you&#8217;re using the native Ollama application on your Mac (which is the recommended approach for the best performance), it will automatically use the GPU. If you choose to run Ollama inside Docker Desktop on a Mac, Docker Desktop handles the GPU passthrough automatically without needing the extra configuration in your <code>docker-compose.yml<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In short: GPU acceleration is a built-in feature of the Ollama macOS application and is automatically handled by Docker Desktop.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 7: Adding a Web User Interface (Optional)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">While the command line and API are powerful, a web-based UI can make interacting with models much easier. <a href=\"https:\/\/github.com\/open-webui\/open-webui\">Open WebUI<\/a> is an excellent open-source choice that integrates seamlessly with Ollama.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To add Open WebUI to your setup, update your <code>docker-compose.yml<\/code> file to include a second service.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>version: '3.8'\n\nservices:\n  ollama:\n    container_name: ollama\n    image: ollama\/ollama:latest\n    ports:\n      - \"11434:11434\"\n    volumes:\n      - ollama_data:\/root\/.ollama\n    restart: always\n  \n  open-webui:\n    container_name: open-webui\n    image: ghcr.io\/open-webui\/open-webui:main\n    ports:\n      - \"3000:8080\"\n    volumes:\n      - open-webui_data:\/app\/backend\/data\n    environment:\n      - OLLAMA_BASE_URL=http:\/\/ollama:11434\n    depends_on:\n      - ollama\n    restart: always\n\nvolumes:\n  ollama_data:\n  open-webui_data:\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s it! You now have a complete, performant, and user-friendly setup for running local LLMs.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Have you ever wanted to run a powerful large language model (LLM) like Llama 3 or Gemma right on your own computer, but you need a consistent and portable setup? That&#8217;s where using Ollama with Docker and Docker Compose comes in. Docker Compose is a fantastic tool that allows you to define and run multi-container [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3898,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[443],"tags":[429,470],"series":[],"class_list":["post-3897","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-spring_ai","tag-ai","tag-ollama"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/08\/ai-generated-8012676_1280.avif","jetpack-related-posts":[{"id":3903,"url":"https:\/\/www.mymiller.name\/wordpress\/docker\/the-s3-local-dev-trick-using-minio-to-simplify-cloud-native-developmen\/","url_meta":{"origin":3897,"position":0},"title":"The S3 Local Dev Trick: Using MinIO to Simplify Cloud-Native Developmen","author":"Jeffery Miller","date":"August 25, 2025","format":false,"excerpt":"As a software architect building cloud-native solutions, you know that working with cloud services like AWS S3 can be a bit tricky in a local development environment. You don't want to constantly connect to a remote bucket, and setting up complex local testing environments can be a pain. But what\u2026","rel":"","context":"In &quot;Docker&quot;","block_context":{"text":"Docker","link":"https:\/\/www.mymiller.name\/wordpress\/category\/docker\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/08\/ai-generated-9268117_1280.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/08\/ai-generated-9268117_1280.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/08\/ai-generated-9268117_1280.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/08\/ai-generated-9268117_1280.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/08\/ai-generated-9268117_1280.avif 3x"},"classes":[]},{"id":1542,"url":"https:\/\/www.mymiller.name\/wordpress\/docker\/docker-networking-101\/","url_meta":{"origin":3897,"position":1},"title":"Docker Networking 101","author":"Jeffery Miller","date":"May 12, 2016","format":false,"excerpt":"Docker by default has three networks with it, that containers may use on the host. \u00a0I will try my best to explain them, and how to use them. Bridge The Bridge network, is the 172.17.0.x network that containers use by default. \u00a0This allows them to connect to each other and\u2026","rel":"","context":"In &quot;Docker&quot;","block_context":{"text":"Docker","link":"https:\/\/www.mymiller.name\/wordpress\/category\/docker\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2016\/05\/network-connection-414415_640.jpg?fit=640%2C426&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2016\/05\/network-connection-414415_640.jpg?fit=640%2C426&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2016\/05\/network-connection-414415_640.jpg?fit=640%2C426&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":1537,"url":"https:\/\/www.mymiller.name\/wordpress\/docker\/docker-basics\/","url_meta":{"origin":3897,"position":2},"title":"Docker Basics 101","author":"Jeffery Miller","date":"May 10, 2016","format":false,"excerpt":"Building Docker Image Once you create your Dockerfile for your image, you need to build it. \u00a0You do that by running the following command from the directory that contains the Dockerfile. docker build -t <image_name> . Change \"image_name\" to be the name you want to give this image. \u00a0If you\u2026","rel":"","context":"In &quot;Docker&quot;","block_context":{"text":"Docker","link":"https:\/\/www.mymiller.name\/wordpress\/category\/docker\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3970,"url":"https:\/\/www.mymiller.name\/wordpress\/architecture\/vibe-coding-the-next-generation-how-we-built-aimud-using-an-ai-ensemble\/","url_meta":{"origin":3897,"position":3},"title":"Vibe Coding the Next Generation: How We Built AIMUD Using an AI Ensemble","author":"Jeffery Miller","date":"April 21, 2026","format":false,"excerpt":"In the traditional world of software engineering, building a Multi-User Dungeon (MUD) is a rite of passage. It requires handling complex state, real-time networking, concurrency, and deep game logic. Usually, this takes months of meticulous, line-by-line keyboard grinding. But for AIMUD, we didn't just code; we vibe coded. By leveraging\u2026","rel":"","context":"In &quot;AI&quot;","block_context":{"text":"AI","link":"https:\/\/www.mymiller.name\/wordpress\/category\/ai\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_6veptk6veptk6vep-scaled.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_6veptk6veptk6vep-scaled.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_6veptk6veptk6vep-scaled.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_6veptk6veptk6vep-scaled.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_6veptk6veptk6vep-scaled.avif 3x"},"classes":[]},{"id":3594,"url":"https:\/\/www.mymiller.name\/wordpress\/docker\/fips-jdk-21-image\/","url_meta":{"origin":3897,"position":4},"title":"FIPS JDK 21 Image","author":"Jeffery Miller","date":"July 12, 2024","format":false,"excerpt":"Warning: Use FIPS Instructions at Your Own Risk The provided Dockerfile and instructions are intended to assist in creating a FIPS-compliant environment for your Spring Boot application. However, achieving and maintaining FIPS compliance is a complex process with potential legal and security implications. By following these instructions, you acknowledge and\u2026","rel":"","context":"In &quot;Docker&quot;","block_context":{"text":"Docker","link":"https:\/\/www.mymiller.name\/wordpress\/category\/docker\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_6lwv546lwv546lwv-jpg.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_6lwv546lwv546lwv-jpg.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_6lwv546lwv546lwv-jpg.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_6lwv546lwv546lwv-jpg.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/Gemini_Generated_Image_6lwv546lwv546lwv-jpg.avif 3x"},"classes":[]},{"id":3878,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_messaging\/building-robust-kafka-applications-with-spring-boot-and-avro-schema-registry\/","url_meta":{"origin":3897,"position":5},"title":"Building Robust Kafka Applications with Spring Boot, and Avro Schema Registry","author":"Jeffery Miller","date":"April 20, 2026","format":false,"excerpt":"As a software architect, designing solutions that are scalable, maintainable, and resilient is paramount. In the world of event-driven architectures, Apache Kafka has become a cornerstone for high-throughput, low-latency data streaming. However, simply sending raw bytes over Kafka topics can lead to data inconsistency and make future evolution a nightmare.\u2026","rel":"","context":"In &quot;Spring Messaging&quot;","block_context":{"text":"Spring Messaging","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_messaging\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/06\/ai-generated-7947638_1280.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/06\/ai-generated-7947638_1280.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/06\/ai-generated-7947638_1280.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/06\/ai-generated-7947638_1280.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/06\/ai-generated-7947638_1280.avif 3x"},"classes":[]}],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3897","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/comments?post=3897"}],"version-history":[{"count":1,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3897\/revisions"}],"predecessor-version":[{"id":3899,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3897\/revisions\/3899"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/media\/3898"}],"wp:attachment":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/media?parent=3897"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/categories?post=3897"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/tags?post=3897"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/series?post=3897"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}