{
  "schema_version": "1.2.0",
  "canonical": "https://approximated.app/guides/examples/phoenix--v1.8.json",
  "example": {
    "id": "phoenix--v1.8",
    "framework": "Elixir Phoenix",
    "edition": "v1.8",
    "edition_status": "current",
    "guide": "https://approximated.app/guides/elixir-phoenix-custom-domains-guide/",
    "version_url": "https://approximated.app/guides/elixir-phoenix-custom-domains-guide/v1.8/",
    "source_file": "src/guides/elixir-phoenix-custom-domains-guide/index.html",
    "edition_source": "src/_partials/guide-editions/phoenix/v1.8.html",
    "upstream_repository": "https://github.com/Approximated-Inc/phoenix-custom-domains-example",
    "upstream_exists": true,
    "published": null,
    "prepared_at": "2026-09-09",
    "publication_status": "local_draft",
    "last_reviewed": "2026-09-09",
    "review_scope": "The final in-place image built from the pinned Elixir digest, and all 28 tests passed. Local HTTP smoke returned 200 with Alpha Studio for alpha.localhost, 200 with Bravo Works for bravo.localhost, and 404 for unknown.localhost. The Docker bridge peer received 404 from the fixture-login endpoint, and the suite rejects a spoofed localhost Host from a non-loopback peer. Coverage also includes real local TCP transport, opposing apx_hit/is_resolving values, readiness-gated routing, literal-IP rejection, tenant and CSRF isolation, confirmed-ID deletion, and a refresh racing completed removal. September 9 provider-mode follow-up: 33 tests, scoped format checks, and compilation with warnings as errors passed offline in Elixir 1.20.4 / OTP 29.0.6. Forced-mock loopback smoke served both tenants and returned 404 for an unknown hostname.",
    "runtime_test_status": "passed_local",
    "upstream_revision": "106bfa5b9e415ab54d7a32d92c2a3d1199fa5bed",
    "tested_versions": {
      "elixir": "1.20.4",
      "erlang_otp": "29.0.6",
      "erts": "17.0.6",
      "phoenix": "1.8.12",
      "phoenix_live_view": "1.2.11",
      "ecto_sqlite3": "0.24.1",
      "req": "0.7.4",
      "container_image": "elixir:1.20@sha256:321ba13236f0831aa0ea6501e3bab9df0ed26188ba8863a53126057f8a933d71"
    },
    "test_commands": [
      "docker build -t phoenix-custom-domains-example:local .",
      "docker run --rm -e MIX_ENV=test phoenix-custom-domains-example:local mix test",
      "docker run --rm --name phoenix-guide-smoke -p 127.0.0.1:4005:4000 phoenix-custom-domains-example:local",
      "curl -H 'Host: alpha.localhost' http://127.0.0.1:4005/",
      "curl -H 'Host: bravo.localhost' http://127.0.0.1:4005/",
      "curl -i -H 'Host: unknown.localhost' http://127.0.0.1:4005/"
    ],
    "api_contract_revision": "99f0de6b74f4a88a7c5674d86c852036f22dcd13",
    "api_paths": [
      "/api/vhosts",
      "/api/vhosts/{id}"
    ],
    "not_tested": [
      "No live Approximated API request was made.",
      "No public DNS or TLS propagation was tested.",
      "The provider-independent walkthrough snippets are illustrative; companion runtime results do not verify every guide snippet."
    ],
    "direct_resource": "https://approximated.app/guides/examples/phoenix--v1.8.json",
    "snippet_count": 11,
    "snippets": [
      {
        "id": "phoenix--v1.8--snippet-1-elixir",
        "language": "elixir",
        "sha256": "7ccb7d22c93c9d0f1340ddc3d51262d66f43e342d6ddc08e246777cc18f43f72"
      },
      {
        "id": "phoenix--v1.8--snippet-2-elixir",
        "language": "elixir",
        "sha256": "275aff40f026f5dcaa5bf85638cc7a2650be0d712ee5023c840e029349b5d905"
      },
      {
        "id": "phoenix--v1.8--snippet-3-bash",
        "language": "bash",
        "sha256": "e525d6bce8275c5edf157bbb722c9df81b9a77c7c55a1f5848cefeebc8a2794b"
      },
      {
        "id": "phoenix--v1.8--snippet-4-elixir",
        "language": "elixir",
        "sha256": "3dc8a127d5e0194550b19cff3c33705c71acafc56a229ab2c471738720b9fb54"
      },
      {
        "id": "phoenix--v1.8--snippet-5-elixir",
        "language": "elixir",
        "sha256": "3c8f3d0d8d7c791d2edcf0ddbbc941a3de1ad902f6db9a2b68503c0b13e020a2"
      },
      {
        "id": "phoenix--v1.8--snippet-6-elixir",
        "language": "elixir",
        "sha256": "df5f1e8bb3b6fe251c78eafbb537a75cd7ca1aa7aa979681a088ddab49542698"
      },
      {
        "id": "phoenix--v1.8--snippet-7-elixir",
        "language": "elixir",
        "sha256": "2ae330c74bfb925e399f0ff8654305a30e2338849c219b089ad1abcc1d4d85d8"
      },
      {
        "id": "phoenix--v1.8--snippet-8-elixir",
        "language": "elixir",
        "sha256": "41250115578b50eec2a5afe1d196d0d189f15650dcba28e1ec3eed7b5eb2be0a"
      },
      {
        "id": "phoenix--v1.8--snippet-9-elixir",
        "language": "elixir",
        "sha256": "e678f5603cb2105bd098de1563e1671ef30a8a8d31f26dd9bf8a19c4743b3792"
      },
      {
        "id": "phoenix--v1.8--snippet-10-elixir",
        "language": "elixir",
        "sha256": "a0f92d1e7bbf4a0ed8464cf822127ed4d3ddba1214db8d7871bb8ce352c432dd"
      },
      {
        "id": "phoenix--v1.8--snippet-11-bash",
        "language": "bash",
        "sha256": "ee5eb393a5836b656ca0f573ac9b0e88d8dcad2007507f6bae4324da4de61cbf"
      }
    ],
    "sources": [
      {
        "url": "https://hex.pm/packages/phoenix/1.8.12",
        "title": "Phoenix 1.8.12 on Hex"
      },
      {
        "url": "https://hex.pm/packages/phoenix_live_view/1.2.11",
        "title": "Phoenix LiveView 1.2.11 on Hex"
      },
      {
        "url": "https://elixir-lang.org/blog/2026/06/03/elixir-v1-20-0-released/",
        "title": "Elixir v1.20 release"
      },
      {
        "url": "https://approximated.app/docs/#virtual-hosts-api",
        "title": "Approximated Virtual Hosts API"
      },
      {
        "url": "https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/ResourceRecordTypes.html",
        "title": "A, AAAA, and CNAME records and apex restrictions"
      },
      {
        "url": "https://developers.cloudflare.com/dns/cname-flattening/",
        "title": "Provider-specific CNAME flattening at the apex"
      },
      {
        "url": "https://approximated.app/docs/#how-approximated-works",
        "title": "Approximated routing, certificates, and dedicated IPv4"
      },
      {
        "url": "https://approximated.app/docs/#edge-verify",
        "title": "Form bot protection with Edge Verify"
      },
      {
        "url": "https://approximated.app/docs/#edge-sequences",
        "title": "Request rules and rate limiting with Edge Sequences"
      },
      {
        "url": "https://approximated.app/docs/#dns-widget",
        "title": "DNS onboarding widget and provider-specific support"
      },
      {
        "url": "https://approximated.app/docs/#webhook-events-virtual-host-monitor-updated",
        "title": "Domain monitoring status webhooks"
      }
    ],
    "walkthrough": {
      "provider_independent": true,
      "optional_integration_anchor": "bonus-approximated",
      "code_scope": "Main walkthrough snippets illustrate adding custom domains to an existing app. They are not a complete standalone application or a copy of the companion implementation.",
      "runtime_verification_scope": "Recorded runtime versions, commands, and results apply to the companion repository implementation. They do not imply that every illustrative guide snippet was executed.",
      "domain_connection_policy": {
        "txt_challenge_required": false,
        "dns_check_in_main": "A brief recommendation to check that DNS points directly or indirectly to the app or its receiving service.",
        "automated_dns_checks": "Explained in the optional Approximated bonus, alongside HTTPS readiness."
      }
    },
    "companion_provider_mode": {
      "default": "auto",
      "api_key_environment_variable": "APPROXIMATED_API_KEY",
      "without_key": "local mock",
      "with_key": "real Approximated API at https://cloud.approximated.app",
      "explicit_mock_override": "APPROXIMATED_PROVIDER_MODE=mock",
      "verification": {
        "date": "2026-09-09",
        "summary": "33 tests, scoped format checks, and compilation with warnings as errors passed offline in Elixir 1.20.4 / OTP 29.0.6. Forced-mock loopback smoke served both tenants and returned 404 for an unknown hostname.",
        "live_api_used": false
      }
    },
    "publication_evidence": {
      "type": "public_companion_git_tag",
      "published_at": "2026-09-09",
      "repository": "https://github.com/Approximated-Inc/phoenix-custom-domains-example",
      "revision": "106bfa5b9e415ab54d7a32d92c2a3d1199fa5bed",
      "tag": "guide-phoenix1.8-r1",
      "tag_url": "https://github.com/Approximated-Inc/phoenix-custom-domains-example/tree/guide-phoenix1.8-r1",
      "anonymous_clone_verified_at": "2026-09-09",
      "scope": "Companion source publication and anonymous HTTPS clone verified. This does not establish guide deployment or live API, DNS, or HTTPS acceptance.",
      "previous_edition_tag": "guide-legacy-2026-09"
    }
  }
}
