Skip to content

Quick Start

Get a photo search running in minutes using published npm packages (@media-sdk/core@^0.3.1, react packages @^0.3.0). No monorepo clone required.

Copy the basic React starter — a self-contained Vite app with Pexels + Pixabay, capability-gated tabs and filters:

bash
# Clone the repo, or copy examples/basic-react to your project
cd examples/basic-react
pnpm install
cp .env.example .env   # add VITE_PEXELS_API_KEY and/or VITE_PIXABAY_API_KEY
pnpm dev

See the starter README for the full 5-minute path.

ts
import { ApiKeyProvider, PexelsMediaClient } from "@media-sdk/core";

const client = new PexelsMediaClient(
  new ApiKeyProvider(process.env.PEXELS_API_KEY!),
);

const result = await client.searchPhotos({
  query: "nature",
  page: 1,
  perPage: 20,
});

console.log(result.items);
console.log(result.pagination);

Install:

bash
pnpm add @media-sdk/core@^0.3.1

Set PEXELS_API_KEY in your environment (see Installation).

React — search with hooks

tsx
import { MediaProvider, useMediaSearch } from "@media-sdk/react";
import { ApiKeyProvider, PexelsMediaClient } from "@media-sdk/core";

const client = new PexelsMediaClient(
  new ApiKeyProvider(import.meta.env.VITE_PEXELS_API_KEY),
);

function SearchApp() {
  const { data, loading, error } = useMediaSearch({
    query: "nature",
    perPage: 20,
  });

  if (loading) return <p>Loading…</p>;
  if (error) return <p>Error: {error.message}</p>;

  return (
    <ul>
      {data?.items.map((photo) => (
        <li key={photo.id}>
          <img src={photo.src.medium} alt={photo.alt ?? ""} />
        </li>
      ))}
    </ul>
  );
}

export function App() {
  return (
    <MediaProvider client={client}>
      <SearchApp />
    </MediaProvider>
  );
}

Install:

bash
pnpm add @media-sdk/core@^0.3.1 @media-sdk/react@^0.3.0 react react-dom

Set VITE_PEXELS_API_KEY in .env for Vite apps.

Pixabay

Swap the client — the hook API stays the same:

ts
import { ApiKeyProvider, PixabayMediaClient } from "@media-sdk/core";

const client = new PixabayMediaClient(
  new ApiKeyProvider(process.env.PIXABAY_API_KEY!),
);

Gate UI features with capabilities, not provider strings:

tsx
import { useMediaCapabilities } from "@media-sdk/react";

function Tabs() {
  const caps = useMediaCapabilities();
  return caps.operations.curatedPhotos ? <CuratedTab /> : null;
}

Next steps

TopicLink
Install all packages and configure TypeScriptInstallation
Pexels auth, curated photos, filtersPexelsMediaClient
Pixabay auth, hotlinking, filtersPixabayMediaClient
Capability matrix and provider differencesProvider Comparison
Multi-provider setup and env varsProvider Configuration
MediaClient interface referenceMediaClient
Capability-driven UI gatingCapabilities
React hooks referenceHooks
Presentational componentsUI Components
Live multi-provider demoDemo