ENGLISH·COURSE API
    Preparing search index...
    • The images.remotePatterns entries a location manifest requires.

      Parameters

      • manifest:
            | {
                version: 1;
                stores: Record<
                    string,
                    | { driver: "local"; baseUrl: string; pathPrefix: string }
                    | {
                        driver: "s3";
                        bucket: string;
                        region: string;
                        endpoint?: string;
                        forcePathStyle: boolean;
                        pathPrefix: string;
                        visibility: "public" | "signed";
                        publicUrl?: string;
                        signedUrlTtlSeconds?: number;
                    }
                    | {
                        driver: "gcs";
                        bucket: string;
                        apiEndpoint?: string;
                        pathPrefix: string;
                        visibility: "public"
                        | "signed";
                        publicUrl?: string;
                        signedUrlTtlSeconds?: number;
                    },
                >;
                default: string;
                routes: { prefix: string; store: string }[];
                overrides: Record<string, string>;
                assets: Record<string, { store?: string; objectPath?: string }>;
            }
            | null

        The parsed location manifest, or null when there is none

        • {
              version: 1;
              stores: Record<
                  string,
                  | { driver: "local"; baseUrl: string; pathPrefix: string }
                  | {
                      driver: "s3";
                      bucket: string;
                      region: string;
                      endpoint?: string;
                      forcePathStyle: boolean;
                      pathPrefix: string;
                      visibility: "public" | "signed";
                      publicUrl?: string;
                      signedUrlTtlSeconds?: number;
                  }
                  | {
                      driver: "gcs";
                      bucket: string;
                      apiEndpoint?: string;
                      pathPrefix: string;
                      visibility: "public"
                      | "signed";
                      publicUrl?: string;
                      signedUrlTtlSeconds?: number;
                  },
              >;
              default: string;
              routes: { prefix: string; store: string }[];
              overrides: Record<string, string>;
              assets: Record<string, { store?: string; objectPath?: string }>;
          }
          • version: 1
          • stores: Record<
                string,
                | { driver: "local"; baseUrl: string; pathPrefix: string }
                | {
                    driver: "s3";
                    bucket: string;
                    region: string;
                    endpoint?: string;
                    forcePathStyle: boolean;
                    pathPrefix: string;
                    visibility: "public" | "signed";
                    publicUrl?: string;
                    signedUrlTtlSeconds?: number;
                }
                | {
                    driver: "gcs";
                    bucket: string;
                    apiEndpoint?: string;
                    pathPrefix: string;
                    visibility: "public"
                    | "signed";
                    publicUrl?: string;
                    signedUrlTtlSeconds?: number;
                },
            >
          • default: string

            Store that answers for a key matching no override and no route.

          • routes: { prefix: string; store: string }[]
          • overrides: Record<string, string>

            Exact key → store name, for single assets that escape their prefix.

          • assets: Record<string, { store?: string; objectPath?: string }>

            Exact key → declared placement. Outranks every other layer.

        • null

      Returns ContentImagePattern[]

      One pattern per store reachable at an absolute http(s) URL

      next/image rejects any remote host absent from that list with a hard 500, so placing posters in a bucket has to widen the allowlist too. Deriving it from the same manifest that routes the content keeps the promise honest: moving an asset stays a configuration change, never a code change.

      Signed stores contribute nothing — their posters are fetched from the app's own origin through the signing endpoint, not from the bucket.

      Each pattern is scoped to its store's path prefix rather than the whole host, so adding one bucket does not implicitly allowlist every image on that domain.